Xcode 8 - IB Designables - Impossibile eseguire il rendering e l'aggiornamento dello stato del layout automatico, L'agente si è bloccato


167

Di recente ho eseguito l'upgrade a Xcode 8 e sto riscontrando problemi con lo Storyboard.

Se apro il progetto e non ho lo Storyboard aperto, verrà compilato ed eseguito correttamente. Una volta aperto lo Storyboard, ricevo più errori su IB Designables come mostrato di seguito.

inserisci qui la descrizione dell'immagine

Queste viste sono le uniche viste che utilizzano viste personalizzate da TextFieldEffectse BEMCheckboxche ho importato utilizzando Cocoapods.


Magari controlla il repository per il Pod che stai utilizzando e vedi se questo problema è prevalente tra gli altri utenti?
Zolnoor,

Qualche risposta pertinente a questo?
Mohsin Khubaib Ahmed,

1
avete trovato qualche soluzione?
tuffo

Attenzione, il problema può essere che AVETE BISOGNO DI UN COSTRUTTORE GRASSO per una libreria integrata . nel mio esempio ho incorporato Swifter. Naturalmente tieni a portata di mano una build grassa (per lo sviluppo - simulatore / telefono) e una build solo per telefono (per app store, solo telefono) e passa a quella solo per telefono quando è necessario inviare a TestFlight ecc. aveva la biblioteca solo telefonica nel progetto !!!!! Doh! Lo scambio con il grasso "corretto" ha risolto il problema.
Fattie,

Risposte:


179

Puoi provare una delle seguenti soluzioni per capire la causa:

  1. cerca i IBDesignablesAgentCocoaTouchlog in questa directory: ~/Library/Logs/DiagnosticReportse vedi la causa.

Nota: per l'utente con Catalina: cercare IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Vai all'editor -> Debug Selected View mentre selezioni il tuo @IBDesignable UIViewnello storyboard e vedi la traccia dello stack.

  2. Elimina la cartella Derive Data.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
    
  3. Pulisci il tuo progetto Shift + Command + Alt + K .

  4. Costruisci il tuo progetto Command + B .


35
Usando questo approccio sono stato in grado di scoprire che il motivo era Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Non sapevo che il IBDesignablesAgentCocoaTouchprocesso chiama init(frame:), invece di init?(coder aDecoder:).
Yevhen Dubinin,

5
@YevhenDubinin Grazie, questo mi ha aiutato. Tutto è andato bene dopo l'implementazione init(frame:)nella mia sottoclasse UIButton
doraemon

2
Questo risolto il mio problema, ma ho dovuto chiudere xCode prima di eliminare i dati derivati
Husam,

2
la migliore risposta init (frame :) è un problema comune
Michał Ziobro,

1
Esci da xcode e cancella DerivedData. Ha risolto il problema.
Mubashar,

80

Ho risolto il problema procedendo come segue:

  1. Vai a File > Workspace settings.
  2. Fai clic sulla piccola freccia a destra accanto a "Dati derivati". Questo apre l'app Finder nella posizione della DerivedDatacartella.
  3. Vai all'interno della DerivedDatacartella ed elimina la cartella corrispondente al tuo progetto.
  4. Esci da Xcode e riaprilo.
  5. Pulisci il tuo progetto shiftcommandk.
  6. costruisci il tuo progetto commandb.
  7. Apri lo storyboard.
  8. Vai a Editor > Refresh all views.

aggiornato

A volte basta andare direttamente al lavoro Editor > Refresh all views. Se Refresh all viewsdisabilitato, esci da Xcode e riprova.


grazie per aver postato questo. Ho fatto una cancellazione della riga di comando "vecchia scuola" dei dati derivati, ma il problema persisteva. Usando il tuo metodo ho risolto il problema per me.
Adrian,

Aggiorna anche tutte le visualizzazioni per la vittoria. Grazie!
Mike K.

56

Ho appena cancellato la vista non riuscita e premo comando + Z per annullare la cancellazione. Per me funziona.

Se la modifica della vista non riuscita in un secondo momento, l'errore può ripresentarsi, eseguire di nuovo quanto sopra.


6
È ridicolo ma ha funzionato.
Ansari,

1
Eccezionale!! Ha funzionato per me
Nupur Sharma il

1
Chissà che potrebbe essere la risposta. Funzionava ancora non ci credo
Asad Amodi

37

Ho riscontrato questo problema in CocoaPod 1.5.0. La soluzione è reinstallare nuovamente pod (installare nuovamente pod) quando viene visualizzato questo errore oppure è possibile utilizzare CocoaPod 1.4.0. Funziona bene in 1.4.0 (almeno per me.)

aggiornare:

Aggiungi il seguente script in Podfile aiutami a risolvere il problema in 1.5.0

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

riferimento: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


100% vero. il downgrade alla 1.4.0 ha risolto il problema per me.
ale_stro,

4
Ha funzionato, baccelli 1.5.0.
Andrey Oshev,

3
si s work for me, you should add FINE` per durare di codice.
Mahdi,

1
Ha funzionato anche per me. Ho provato tutti gli altri suggerimenti senza successo. Testato con Pods 1.3.1
Sal

18

L'aggiunta del seguente codice alla mia @IBDesignableclasse ha funzionato.

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

Questo funziona per me. In effetti, ho aggiunto due override per l'estensione UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Quindi ricostruzione e avviso (errore) andati. Non è nemmeno necessario pulire la cartella di build.
John Pang,

Grazie! Buona risposta)
JiosDev il

13

Per chiunque, come me, che non riesce a trovare quel IBDesignablesAgentCocoaTouchfile o quando si tenta di "Debug Selected Views" dall'editor ottiene un errore, ecco un altro modo per eseguire il debug di quegli errori "Impossibile eseguire il rendering".

Apri l'app 'Console', dalla barra laterale seleziona il tuo Mac attuale (probabilmente sarà selezionato automaticamente per impostazione predefinita) e quindi nella barra di ricerca cerca "IBSceneUpdate" e premi invio.

In questo modo, ogni volta che viene visualizzato un errore Xcode per IBDesignablenon essere in grado di eseguire il rendering, verrà visualizzata anche una nuova voce "IBSceneUpdate" con ulteriori dettagli sull'errore.

È almeno così che sono stato in grado di eseguire il debug dei miei IBDesignableerrori!

App console che mostra errori IBSceneUpdate


1
L'app è una console reale piuttosto che un terminale, proprio come una FYI.
Carl Upton,

Buona pesca! Modificato la mia risposta.
Stelabouras,

12

Se stai usando il file xib per uiview personalizzato. Prova questo:

Cambio da

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

Per:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)

8

Prova a disabilitare "Usa varianti di tratto" (pannello Identità e Tipo) per qualsiasi file xib che potresti avere per le viste personalizzate utilizzate nello storyboard.


7

il mio problema è stato risolto eliminando le cartelle (relative a questo progetto) dalla cartella dei dati derivati. puoi farlo facendo clic su File -> Impostazioni progetto -> quindi fai clic sul segno di freccia deside /Users/.../Xcode/DerivedData facendo clic sulla cartella DerivedData vedrai che il tuo progetto con nome cartelle elimina quelle. esci da xcode per aprire il tuo progetto, pulisci il progetto usando questo passaggio Product-> clean, quindi crea il progetto: Product-> Build Questi risolveranno questo problema.


4

Risposta corretta fornita da @Maria :

controllare il rapporto sugli arresti anomali all'indirizzo ~/Library/Logs/DiagnosticReports

Modo alternativo :

  1. Aperto Spotlight

inserisci qui la descrizione dell'immagine

  1. genere console.app

inserisci qui la descrizione dell'immagine

  1. Selezionare Crash reports

inserisci qui la descrizione dell'immagine

  1. controllare uno per IBDesignablesAgent-iOSe rivedere il registro degli arresti anomali

L'uso della console mi ha aiutato a risolvere il mio problema. Messaggi molto più dettagliati di quelli presenti in Xcode.
Andrew Moore,


3

Ho provato a pulire ed eseguire il progetto non risolverà questo problema.

Ma ha chiuso e riaperto il progetto.


2

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. Fare 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
Potresti approfondire come questo risolve effettivamente il problema?
Paula Hasstenteufel,

questo risolto il problema ma ancora non so perché sia ​​insolito che use_frameworks perché è giusto per il progetto rapido
Abhishek

Il mio Podfile sta già utilizzando i framework, qualche suggerimento passato fa il commento?
mmr118,

@ moni15 ho aggiunto un'altra soluzione possibile. Si prega di controllare.
Ashish Pisey,

Uncommenting #use_frameworks nel file pod e la cancellazione di DerivedData ha funzionato per me.
Jugal Desai,

2

Ho avuto lo stesso problema e sono venuto qui per cercare di capire cosa è successo. Ho notato la risposta più votata e la risposta stessa non mi ha aiutato, poiché IBDesignable non esisteva nella cartella dei registri e ho già provato tutte le altre opzioni lì, tuttavia nei commenti ho notato che qualcuno parlava di un frame init.

Ho deciso di provare a commentare la mia estensione IBDesignable per UIView e risolto immediatamente il problema. Quindi, per risolvere questo problema, trova l'estensione che causa il problema e assicurati di impostare gli init richiesti creando una classe IBDesignable e fornendo gli inizializzatori richiesti come segue:

@IBDesignable class RoundedView: UIView {

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

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

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
}

func sharedInit() {
}
}

IMPORTANTE: ricordati di aggiungere la nuova classe all'elemento su cui stai usando il designabile.


1
Come dice la sua documentazione, non dimenticare di chiamare super.prepareForInterfaceBuilder () nella tua implementazione di preparForInterfaceBuilder ().
Jaime S

1

Si è verificato lo stesso errore: UITextField personalizzato e utilizzando l'interfaccia builder, l'errore nella console era -Uso dell'inizializzatore non implementato 'init (frame :)' per la classe "CustomField"

Aggiunto l'inizializzatore per correggere l'errore


1

Ho riscontrato questo problema dopo l'aggiornamento all'ultima versione di XCode. Dopo aver provato la soluzione multipla sopra descritta, ho solo abbastanza Xcode e quindi ho spento il sistema e acceso e ha funzionato per me.


0

Dopo aver apportato le modifiche necessarie, cambiare lo storyboard o nel mio caso un .xib per aprire in "XCode 7", salvare e chiudere. Questa è solo una misura di stop gap per affrontare gli errori, ma alla fine dovrai correggerli o farlo fino a quando non sarai più in grado di farlo.


0

Nel mio caso, stavo usando una libreria che stava subclassando UIView. Stava usando IB_DESIGNABLEe mancava la chiamata a [super awakeFromNib]. Dopo aver aggiunto la chiamata a questo metodo, il bug è scomparso.

Non sono sicuro che il fatto che sia stato implementato abbia IB_DESIGNABLEavuto un impatto in questo.


Dove hai aggiunto il codice per [super awakeFromNib]? Puoi condividere il tuo codice?
TheJeff

0

Questo è il modo più semplice per me: aggiungi questo script al tuo Podfile

Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.product_type == "com.apple.product-type.bundle"
    target.build_configurations.each do |config|
      config.build_settings['CONFIGURATION_BUILD_DIR'] = '$PODS_CONFIGURATION_BUILD_DIR'
    end
  end
end

Fonte:

Questa soluzione alternativa per @IBDesignable è disponibile qui: https://github.com/CocoaPods/CocoaPods/issues/5334

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.