@IBDesignable errore: IB Designables: impossibile aggiornare lo stato del layout automatico: Interface Builder Cocoa Touch Tool si è bloccato


157

Ho una sottoclasse molto semplice di UITextView che aggiunge la funzionalità "Segnaposto" che puoi trovare nativa nell'oggetto Campo di testo. Ecco il mio codice per la sottoclasse:

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
        }
    }
}

Dopo aver modificato la classe per l' UITextViewoggetto in Identity Inspector in PlaceholderTextView, posso impostare Placeholderbene la proprietà in Attribute Inspector. Il codice funziona benissimo quando si esegue l'app, ma non mostra il testo segnaposto nel builder di interfacce. Ottengo anche i seguenti errori non bloccanti (suppongo che questo sia il motivo per cui non viene visualizzato in fase di progettazione):

errore: IB Designables: impossibile aggiornare lo stato del layout automatico: Interface Builder Cocoa Touch Tool si è bloccato

errore: IB Designables: impossibile eseguire il rendering dell'istanza di PlaceholderTextView: il rendering della vista ha richiesto più di 200 ms. Il codice del disegno potrebbe subire rallentamenti.

Non sono in grado di capire cosa sta causando questi errori. Il secondo errore non ha alcun senso, poiché non ho nemmeno la precedenza su drawRect (). Qualche idea?


1
Stavo ricevendo questo errore. L'oggetto ha funzionato bene in un progetto di test, ma non nel mio progetto principale (in una tabella). Secondo developer.apple.com/library/mac/recipes/… , ho scelto Scegli editor> Debug Selected Views. Poi ho ottenuto "Impossibile eseguire il debug delle visualizzazioni" "Assicurati che il tuo framework abbia le impostazioni di build corrette per la creazione per iOS." Non è emerso nulla in Google per questo errore.
Matt,

Risposte:


238

Esistono rapporti sugli arresti anomali generati in caso di crash di Interface Builder Cocoa Touch Tool. Le tesi si trovano ~/Library/Logs/DiagnosticReportse nominate IBDesignablesAgentCocoaTouch_*.crash. Nel mio caso contenevano un utile stack-trace che identificava il problema nel mio codice.


1
Grazie! Questo è stato super utile! Dove hai trovato le informazioni sui rapporti sugli arresti anomali? :)
Ben-G

57
Nel mio caso, ho scoperto che initFrame(frame: CGRect)deve essere definito. Fallo se fornisci i tuoi initmetodi.
Travis,

Questa è stata la soluzione migliore. Non ero implementazione initWithFrame su una delle viste.
HotFudge domenica

3
Ho usato i report diagnostici e come menzionato @Travis, avevo bisogno di sovrascrivere init(frame: CGRect)esplicitamente perché avevo un inimetodo personalizzato . Potresti voler esaminare il rapporto sugli arresti anomali use of unimplemented initializer 'init(frame:)'direttamente sotto Application Specific Informationnel rapporto. Grazie ragazzi! Doppia vittoria in questa risposta!
Chris,

4
Come al solito, questo file di registro è disponibile anche nell'app Console macOS, nel gruppo Rapporti di diagnostica utente .
Paulo Mattos,

51

Ho avuto lo stesso problema un paio di volte. Entrambe le volte è iniziato quando stavo caricando un pennino IBDesignable sullo storyboard quando il pennino non era in grado di adattarsi alla vista (cioè avevo un pulsante di UIView ma ancora nel pennino). Una volta risolto il problema, Xcode mi dava ancora degli errori, quindi ho riavviato Xcode fino a quando ha smesso casualmente di darmi l'errore.

Spero che aiuti.

AGGIORNAMENTO: Ho appena terminato tutti i processi denominati "Interface Builder Cocoa Touch Tool", riavviato Xcode e l'errore è scomparso. Non so se funzionerà sempre o no.


2
Anche se ancora non capisco perché, se non si sovrascrive nessuno dei initmetodi, il codice pubblicato come parte della domanda non mostra più gli IB Designableserrori e il segnaposto viene visualizzato correttamente in Interface Builder.
Willington Vega,

2
Forse questo è un bug e dobbiamo solo aspettare che venga risolto. Forse in Xcode 6.3.
Youssef Moawad

3
XCode 7.1.1 e ancora presente. Il riavvio di XCode non ha risolto il problema. Ho dovuto uccidere manualmente tutti i processi chiamati Interface Builder Cocoa Touch Tool, quindi XCode si è bloccato, riavviato e ha iniziato a funzionare.
Cristian Pena,

1
Punto importante: in effetti PRIMA di interrompere i processi del builder di interfaccia, quindi arrestare XCode - se lo si fa al contrario, il problema persiste ...
TheEye,

2
XCode 8.1 questo errore si verifica ancora. Originariamente causato da non avere l'override di init ma persisteva dopo l'aggiunta di init. Ho dovuto interrompere i processi di Interface Builder come descritto, quindi riavviare xcode come dice @TheEye
John Fowler,

39

Nel mio caso, stavo facendo il prossimo nei metodi initWithFrame / initWithCoder per creare la vista:

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

Sembra che mi è stato non suppone di utilizzare il Bundle principale , ma invece il fascio di classe. Quindi ho sostituito quel codice per il seguente e ha funzionato:

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

Ho pensato che forse questo potrebbe aiutare qualcuno.


1
Anche questo ha risolto il mio problema! Grazie @jmoukel!
edopelawi,

Quello risolto il mio problema. Uomo!!! non potevo notare quella linea "bundleForClass" anche se ho esaminato questa soluzione un paio di volte. :(
elk_cloner

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

14

È possibile selezionare la visualizzazione personalizzata in Interface Builder e l'uso poi Editor, Debug Selected Views. Avvierà la cosiddetta IBDesignableAgentCocoaTouchsessione di debug quando tutti i punti di interruzione (compresi i punti di interruzione delle eccezioni) funzionano e potresti identificare esattamente il luogo in cui la vista si arresta in modo anomalo.


Perfetto! Anche questo ha riscontrato il mio problema: un carattere errato. Il che spiega perché solo uno dei sei IBDesignables molto simili stava fallendo.
zkarj

13

Per Xcode 8 - Swift

Aggiunta di valore opzionale come valore predefinito per @IBInspectablecausare problemi per me.

Questo non funzionerà:

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

Questo dovrebbe funzionare:

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

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

@DungTran Quale problema stai affrontando?
Mohammad Zaid Pathan,

1
La gestione opzionale previene l'incidente. Ma sai cosa sta causando UIImage (chiamato :) per restituire zero in modo coerente?
ScottyBlades,

Commentando questo codice è stato risolto per me `@objc @available (*, deprecato, rinominato:" backgroundColor ") @IBInspectable public var signatureBackgroundColor: UIColor = .white {didSet {backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

Stavo riscontrando problemi simili a Interface Builder nel rendering di designable.

Usando la tecnica suggerita in questa risposta sono stato in grado di rintracciare il problema all'uso dei letterali di immagini.

Arresto anomalo del rendering

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

Nessun arresto anomalo del rendering

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

Sei un eroe.
nathangitter,

Qualche idea sul perché i letterali delle immagini siano incompatibili con IB? Ho avuto lo stesso problema.
Swifts

6

In realtà se hai alcuni vecchi attributi definiti dall'utente (che non sono validi per la vista corrente) in qualsiasi vista nello storyboard, ciò potrebbe causare il crash dell'agente.

Inoltre, a volte succede solo a causa di un brutto bug di Xcode. Per provarlo, quando sei nello storyboard deseleziona Editor> Aggiorna automaticamente le viste, quindi passa a un altro file, pulisci e riavvia il progetto. Dopo aver inserito di nuovo lo storyboard, puoi fare clic su Editor> Aggiorna viste e controllare di nuovo uno automatico. Anche quello ha risolto il mio problema una volta.

Se entrambi non hanno funzionato, probabilmente hai fatto qualcosa di sbagliato nella tua vista IBDesignable, quindi scegli le viste bloccate nello storyboard e nel debug facendo clic su Editor> Viste di debug


Sei un dono di Dio.
Andrewcar,

4

Questo non è il caso di questa domanda, ma forse aiuterò qualcun altro.

Ho avuto un problema simile quando nella mia classe @IBDesignable non ho implementato entrambi:

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

    // custom setup
}

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

    // custom setup
}

Dovresti sempre implementare entrambi i metodi init. Init con frame viene utilizzato quando si avvia la visualizzazione dal codice e init con aDecoder viene utilizzato da InterfaceBuilder.
Skodik.o

4

Ho avuto lo stesso problema e l'ho risolto aggiungendo "use_frameworks!" al Podfile del mio progetto.

Spero che ti aiuti.


Questo ha funzionato per me quando ho avuto questo problema con JVFloatLabeledTextField
saswanb

Questo è ciò che ha funzionato per me, adottando un vecchio progetto Obj-C che era abbastanza obsoleto. L'IB si illumina come un albero di Natale dopo questo! Grazie.
disegnò ..

3

Nel mio caso era in qualche modo correlato a un framework di cartagine che stavo usando. Ho dovuto aggiungere $ (PROJECT_DIR) / Carthage / Build / iOS all'impostazione build Percorsi di ricerca percorso


Dopo aver provato tutte le altre soluzioni pubblicate ... questa è stata l'unica soluzione che ha funzionato per me! Grazie!
Gioele

3

Nel mio caso, è stato un problema con OneSignal. Apparentemente, hanno un bug all'interno della versione 2.2.0 e successive. Passato a 2.1.6 e tutto è di nuovo fantastico!

Dai un'occhiata a questo .


1

Quando ho eseguito il debug ho scoperto che ci sono alcune classi che stanno modificando l'interfaccia utente. Tipicamente marquelabel che è una sottoclasse di UILabel o di qualsiasi altra sottoclasse di classe UIView e disegna l'interfaccia utente in fase di esecuzione e si scontra con il motore di Autolayout. Prova a fornire larghezza o altezza fisse per queste viste personalizzate. Se il problema persiste, prova le seguenti soluzioni: -

Soluzione 1: - Rimuovere il commento #use_frameworks all'interno del file pod.

Soluzione 2: - Provare a eliminare i dati derivati. 1. Chiudi la finestra dell'Editor del tuo Xcode ed esci dal simulatore -> 2. Vai a Preferenze Xcode -> Posizioni -> 3. Fai clic su una piccola freccia grigia che mostra il percorso dei dati derivati ​​-> 4. Seleziona il tuo progetto -> 5. Elimina tutte le cartelle all'interno -> 6. Esci da Xcode e riapri


1

Aggiungilo in fondo al tuo Podfile ed eseguilo 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

Aggiungi questo script alla fine del mio Podfileed eseguito di pod installnuovo.

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

Un grosso problema è quando stai creando @ IBDesignable assicurati che il file cocoapod non sia incluso negli UITest, altrimenti causerà questo crash.


0

Trovo che la ragione sia che il tuo xib non ha le stesse dimensioni del design nello storyboard. Assicurati che lo xib abbia la stessa altezza e larghezza.


0

Mi mancava solo questa riga di codice platform :ios, '7.0' e il problema è stato risolto. Sarà risolta solo questa riga nel file pod e aggiorna il problema relativo al pod.


0

Per me era un certificato di firma mancante, perché non ho mai eseguito l'app, quindi Xcode non ha ancora creato un certificato. Una volta eseguita l'app, il IBDesignablerendering ha funzionato bene.


0

È come se ottenessi il codice da un altro sviluppatore e ricevi questo errore. Corri

pod install

Questo ha funzionato per me. Spero che sia d'aiuto.


0

Assicurati di non inizializzare direttamente UIImageoUIFont utilizzare risorse o caratteri aggiunti nel tuo progetto.

Creo sempre un private func setUp()nelle mie lezioni @IBDesignablepersonalizzate UI. che è chiamato da init(frame: CGRect), init?(coder aDecoder: NSCoder). Così ho finalmente aggiornato setup()il seguente.

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

Lascialo compilare ed eseguire sul simulatore se hai un errore in qualche altra parte del progetto, commentalo ed esegui prima il designable per aggiornare il designable e rimuovere il commento dagli altri codici. Per me funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.