@IBTasarımlanabilir hata: IB Tasarlanabilirler: Otomatik düzen durumu güncellenemedi: Arayüz Oluşturucu Kakao Dokunmatik Aracı çöktü


157

Metin alanı nesnesine yerel bulabilirsiniz "yer tutucu" işlevini ekler UITextView çok basit bir alt sınıf var. İşte alt sınıf için benim kod:

import UIKit
import Foundation

@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
    @IBInspectable var placeholder: String = "" {
        didSet {
            setPlaceholderText()
        }
    }
    private let placeholderColor: UIColor = UIColor.lightGrayColor()        
    private var textColorCache: UIColor!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.delegate = self
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = self
    }
    
    func textViewDidBeginEditing(textView: UITextView) {
        if textView.text == placeholder {
            textView.text = ""
            textView.textColor = textColorCache
        }
    }
    
    func textViewDidEndEditing(textView: UITextView) {
        if textView.text == "" && placeholder != "" {
            setPlaceholderText()
        }
    }
    
    func setPlaceholderText() {
        if placeholder != "" {
            if textColorCache == nil { textColorCache = self.textColor }
            self.textColor = placeholderColor
            self.text = placeholder
        }
    }
}

UITextViewKimlik Denetçisindeki nesnenin sınıfını olarak değiştirdikten sonra , Özellik Denetçisinde özelliği gayet iyi PlaceholderTextViewayarlayabilirim Placeholder. Kod, uygulamayı çalıştırırken harika çalışıyor, ancak arayüz oluşturucuda yer tutucu metni görüntülemiyor. Ayrıca aşağıdaki engelleme olmayan hataları alıyorum (bu yüzden tasarım zamanında oluşturulmadığını varsayıyorum):

hata: IB Tasarım öğeleri: Otomatik düzen durumu güncellenemedi: Arayüz Oluşturucu Kakao Dokunmatik Aracı çöktü

error: IB Designables: PlaceholderTextView örneği işlenemedi: Görünümü oluşturma 200 ms'den uzun sürdü. Çizim kodunuz düşük performansa sahip olabilir.

Bu hatalara neyin sebep olduğunu bulamıyorum. İkinci hata herhangi bir anlam ifade etmiyor, çünkü drawRect () geçersiz kılmıyorum bile. Herhangi bir fikir?


1
Bu hatayı alıyordum. Nesne bir test projesinde iyi çalıştı, ancak ana projemde (tabloda) işe yaramadı. Developer.apple.com/library/mac/recipes/… 'a göre , Edit> Seçili Görünümlerde Hata Ayıkla'yı seçtim. Sonra "Görünümler hata ayıklanamadı" mesajı aldım. Çerçevenizin iOS için oluşturma için doğru oluşturma ayarlarına sahip olduğundan emin olun. Bu hata için Google'da hiçbir şey bulunamadı.
Matt

Yanıtlar:


238

Arabirim Oluşturucu Kakao Dokunmatik Aracı çöktüğünde oluşturulan çökme raporları vardır. Tezler yer alır ~/Library/Logs/DiagnosticReportsve adlandırılır IBDesignablesAgentCocoaTouch_*.crash. Benim durumumda, kodumda sorunu tanımlayan yararlı bir yığın izleme içeriyorlardı.


1
Teşekkürler! Bu süper yardımcı oldu! Çökme raporlarıyla ilgili bilgileri nerede buldunuz? :)
Ben-G

57
Benim durumumda, initFrame(frame: CGRect)bunun tanımlanması gerektiğini keşfettim . Kendi inityöntem (ler) inizi sağlayın .
Travis

Bu en iyi çözümdü. Ben bir görünümde initWithFrame uygulama değildi.
HotFudgeSunday

3
Tanılama raporlarını kullandım ve @Travis'in belirttiği gibi, init(frame: CGRect)özel bir iniyöntemim olduğu için açıkça geçersiz kılmam gerekiyordu . use of unimplemented initializer 'init(frame:)'Doğrudan raporun altındaki kilitlenme raporunu incelemek isteyebilirsiniz Application Specific Information. Teşekkürler beyler! Bu cevapta iki kat kazan!
Chris

4
Her zamanki gibi, bu günlük dosyası Konsol macOS uygulamasında, Kullanıcı Tanı Raporları grubunun altında da bulunur .
Paulo Mattos

51

Aynı sorunu birkaç kez yaşadım. Her iki kez de, nib görünüme sığmadığı zaman film şeridine bir IBDesignable ucu yüklerken başladım (yani UIView'in dışında bir düğme vardı, ancak yine de uçta). Bir kez ben Xcode hala bana hata verdi sabit bu yüzden rastgele bana hata veren duruncaya kadar Xcode yeniden başladı.

Umarım bu yardımcı olur.

GÜNCELLEME: Az önce "Interface Builder Cocoa Touch Tool" adlı tüm işlemleri öldürdüm, Xcode'u yeniden başlattım ve hata ortadan kalktı. Bunun her zaman işe yarayıp yaramayacağını bilmiyorum.


2
Hala nedenini anlamıyorum, inityöntemlerden herhangi birinin üzerine yazmazsanız , sorunun bir parçası olarak gönderilen kod artık IB Designableshataları göstermez ve yer tutucu Arabirim Oluşturucu'da düzgün bir şekilde işlenir.
Willington Vega

2
Belki de bu bir hatadır ve düzeltilmesini beklememiz gerekir. Belki Xcode 6.3'te.
Youssef Moawad

3
XCode 7.1.1 ve hala mevcut. XCode'u yeniden başlatmak sorunu çözmedi. Arayüz Oluşturucu Kakao Dokunmatik Aracı adı verilen tüm işlemleri manuel olarak öldürmek zorunda kaldım, sonra XCode çöktü, yeniden başlattı ve çalışmaya başladı.
Cristian Pena

1
Önemli nokta: Gerçekten İLK arayüz oluşturucu süreçlerini öldürün, sonra
XCode'u

2
XCode 8.1 bu hata oluşmaya devam ediyor. Başlangıçta init geçersiz kılmamasından kaynaklanır, ancak init eklendikten sonra da devam eder. @TheEye dediği gibi xcode yeniden başlattıktan sonra Arayüz Oluşturucu süreçleri öldürmek zorunda
John Fowler

39

Benim durumumda, görünümü oluşturmak için initWithFrame / initWithCoder yöntemlerinde sonraki yapıyordum:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

Ben olduğu anlaşılıyor değil kullanmak gerekiyordu Ana Paketi yerine sınıfın paket ama. Bu yüzden aşağıdakiler için bu kodu değiştirdim ve çalıştı:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

Bunun birisine yardım edebileceğini düşündüm.


1
Bu da benim sorunumu çözdü! Teşekkürler @jmoukel!
edopelawi

Bu benim sorunumu çözdü. Adam!!! düz-se bile bu çözüm içine birkaç kez baktı "bundleForClass" hattı fark edemedi. :(
elk_cloner

let bundle = Bundle(for: ValidatingTextField.self)in Swift
Cfr

14

Sen Interface Builder ve sonra kullanımda özel görünümünüzü seçebilir Editor, Debug Selected Views. IBDesignableAgentCocoaTouchTüm kesme noktaları (istisna kesme noktaları dahil) çalıştığında hata ayıklama oturumu başlatacak ve görünümünüzün çöktüğü yeri tam olarak tanımlayabilirsiniz.


Mükemmel! Bu da benim sorunum bulundu - yanlış bir yazı tipi. Bu da altı benzer IBDesignable'dan sadece birinin neden başarısız olduğunu açıklıyor.
zkarj

13

For Swift - Xcode 8

@IBInspectableBenim için soruna neden olması için varsayılan değer olarak isteğe bağlı değer ekleme .

Bu işe yaramaz:

@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
      didSet {
       // configureView
      }
}

Bu çalışmalı:

@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
    didSet {
        // configureView()
    }
}

class func getDefaultImage() -> UIImage {
    if let defaultImage = UIImage(named: "myImage") {
        return defaultImage
    } else {
        return UIImage()
    }
}

@DungTran Hangi sorunla karşı karşıyasınız?
Mohammad Zaid Pathan

1
İsteğe bağlı kullanım çökmeyi önler. Peki UIImage'ın (adlı :) nil 'in sürekli olarak geri dönmesine neden olan şeyin ne olduğunu biliyor musunuz?
ScottyBlades

Bu kodu yorumlamak benim için düzeltti `@objc @available (*, kullanımdan kaldırıldı, yeniden adlandırıldı:" backgroundColor ") @IBInspectable public var signatureBackgroundColor: UIColor = .white {didSet {backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

Benzer arabirim oluşturucu tasarımları oluşturma sorunları yaşıyordum.

Bu cevapta önerilen tekniği kullanarak, görüntü değişmezlerinin kullanımıyla ilgili sorunu izleyebildim.

İşleme kazası

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

Render çökmesi yok

self.backgroundImage.image =  UIImage(named: "rectangleCenter")

Sen bir kahramansın.
nathangitter

Görüntü değişmezlerinin neden IB ile uyumsuz olduğu hakkında bir fikriniz var mı? Aynı sorunu yaşadım.
SwiftsNamesake

6

Aslında bazı eski kullanıcı tanımlı özellikleriniz varsa , film şeridinizdeki herhangi bir görünümde (geçerli görünüm için geçerli değildir), ajanınızın çökmesine neden olabilir.

Ayrıca, bazen sadece kötü bir Xcode hatası nedeniyle olur. Bunu kontrol etmek için film şeridindeyken Editör> Görünümleri Otomatik Olarak Yenile'nin işaretini kaldırın, ardından başka bir dosyaya taşıyın, projenizi temizleyin ve yeniden başlatın. Film şeridine tekrar girdikten sonra Editör> Görünümleri Yenile'yi tıklayıp otomatik olanı tekrar kontrol edebilirsiniz. Bu da benim sorunumu bir kez çözdü.

Her ikisi de işe yaramadıysa, muhtemelen IBDesignable görünümünüzle ilgili yanlış bir şey yaptınız, bu nedenle editör> Hata Ayıklama Görünümleri'ni tıklayarak film şeridinde ve hata ayıklamada çökmüş görünümlerinizi seçin


Siz Tanrının bir armağanısınız.
andrewcar

4

Bu soru için durum böyle değil, ama belki başka birine yardım edeceğim.

@IBDesignable sınıfımda her ikisini de uygulamadığım zaman benzer bir sorun yaşadım:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // custom setup
}

override init(frame: CGRect) {
    super.init(frame: frame)

    // custom setup
}

Her zaman her iki init yöntemini de uygulamalısınız. Çerçeveyle başlat, görünümünüzü koddan başlattığınızda ve aDecoder ile başlattığınızda InterfaceBuilder kullanılır.
Skodik.o

4

Aynı sorunu yaşadım ve 'use_frameworks!' Projemin Podfile'sine.

Umarım size yardımcı olur.


JVFloatLabeledTextField
saswanb

Benim için işe yarayan, oldukça eski olan eski bir Obj-C projesini benimsedi. Bundan sonra IB bir Noel ağacı gibi yanıyor! Teşekkür ederim.
çekti ..

3

Benim durumumda bir şekilde kullandığım bir kartaca çerçevesi ile ilgiliydi. Runpath Arama Yolları derleme ayarına $ (PROJECT_DIR) / Carthage / Build / iOS eklemem gerekiyordu


Diğer tüm yayınlanmış çözümleri denedikten sonra ... bu benim için çalışan tek düzeltme oldu! Teşekkürler!
Joel

3

Benim durumumda, OneSignal ile ilgili bir sorun vardı. Görünüşe göre, 2.2.0 ve üstü sürümlerinde bir hata var. 2.1.6'ya geçti ve her şey yine harika!

Check out bu .


1

Ne zaman bu hata ayıklama UI değiştiren bazı sınıflar olduğunu öğrendim. Genellikle UILabel'in bir alt sınıfı veya UIView'in başka bir sınıf alt sınıfı olan ve çalışma zamanında UI çizim ve Autolayout motoru ile çarpışan marquelabel. Bu özel görünümler için sabit genişlik veya yükseklik vermeyi deneyin. Sorununuzu çözmezse Aşağıdaki çözümleri deneyin: -

1.Çözüm: - Pod dosyanızın içindeki #use_frameworks komutunu kaldırın.

Çözüm 2: - Türetilmiş verileri silmeyi deneyin. 1. Xcode'unuzun Editör penceresini kapatın ve simülatörden çıkın -> 2. Xcode Tercihleri ​​-> Konumlar -> 3'e gidin. Türetilmiş veri yolunu gösteren küçük gri oku tıklayın -> 4. Projenizi seçin -> 5. İçindeki tüm klasörleri silin -> 6. Xcode'tan çıkın ve yeniden açın


1

Podfile'ınızın altına ekleyin ve çalıştırın pod install

# Workaround for Cocoapods issue #7606

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
            config.build_settings.delete('CODE_SIGNING_ALLOWED')
            config.build_settings.delete('CODE_SIGNING_REQUIRED')
        end
    end

1

Bu komut dosyasını sonuna ekledim Podfileve pod installtekrar gerçekleştirdim .

post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
        config.build_settings.delete('CODE_SIGNING_ALLOWED')
        config.build_settings.delete('CODE_SIGNING_REQUIRED')
    end
end

1

@ IBDesignable oluştururken önemli bir sorun, cocoapod dosyasının UITest'lerde bulunmadığından emin olmanızdır , aksi takdirde bu çökmeye neden olur.


0

Bunun sebebinin xib'inizin storyboard'daki tasarımla aynı boyutta olmamasıdır. Xib'in aynı yükseklik ve genişliğe sahip olduğundan emin olun.


0

Ben sadece bu kod satırı eksikti platform :ios, '7.0' ve sorun çözüldü. Sadece pod dosyanızdaki bu satır ve pod sorununuzu güncelleyin çözülecektir.


0

Benim için bu eksik imzalama sertifikasıydı, çünkü uygulamayı hiç çalıştırmadım, bu yüzden Xcode henüz bir sertifika oluşturmadı. Uygulamayı çalıştırdıktan sonra, IBDesignablerender iyi çalıştı.


0

Diğer Geliştiriciden Kod aldıysanız ve bu hatayı alıyorsanız. Sadece koş

pod install

Bu benim için çalıştı. Umarım yardımcı olur.


0

Doğrudan başlatılmadığınızdan emin olun UIImageveyaUIFontProjenize eklenen varlıkları veya yazı tiplerini kullanmadığınızdan .

Hep bir oluşturmak private func setUp()benim içinde @IBDesignableözel UIsınıflar. olan denir init(frame: CGRect), init?(coder aDecoder: NSCoder). Sonunda setup()aşağıdaki gibi güncelledim .

private func setUp() {

     //... Doing initial configurations

     // iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
     if let icon = UIImage(named: "IconImageName") {
          iconImageView.image = icon
          iconImageView.frame.size = icon.size
     }

     // nameLabel.font =  UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
     if let font = UIFont(name: "Calibri-Light", size: size) {
          nameLabel.font =  font
     } else {
          nameLabel.font = UIFont.systemFont(ofSize: size) 
     }

     // Doing other stuffs
}

-1

Sadece projede başka bir yerde hata varsa simülatör inşa etmesine ve çalıştırmasına izin verin, sadece yorum yapın ve tasarlanabilir ve diğer kodları uncomment etmek için önce tasarlanabilir çalıştırın. Benim için çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.