Xcode 8 - IB Designables - Échec du rendu et de la mise à jour de l'état de la mise en page automatique, l'agent a planté


167

J'ai récemment mis à niveau vers Xcode 8 et j'ai des problèmes avec le Storyboard.

Si j'ouvre le projet et que je n'ai pas le Storyboard ouvert, il se compilera et fonctionnera très bien. Une fois que j'ouvre le Storyboard, j'obtiens plusieurs erreurs concernant IB Designables, comme indiqué ci-dessous.

entrez la description de l'image ici

Ces vues sont les seules vues qui utilisent des vues personnalisées TextFieldEffectset BEMCheckboxque j'ai importées à l'aide de Cocoapods.


Peut-être vérifier le référentiel du pod que vous utilisez et voir si ce problème est répandu parmi les autres utilisateurs?
Zolnoor le

Une réponse pertinente à cela?
Mohsin Khubaib Ahmed

1
avez-vous trouvé une solution de contournement?
dip

Attention, le problème peut être que VOUS AVEZ BESOIN D'UNE FAT BUILD pour une bibliothèque intégrée . dans mon exemple, j'ai intégré Swifter. Naturellement, vous gardez sous la main une grosse version (pour le développement - simulateur / téléphone) et une version pour téléphone uniquement (pour l'App Store, téléphone uniquement) et vous passez simplement au téléphone uniquement lorsque vous en avez besoin pour soumettre à TestFlight, etc. avait la bibliothèque réservée au téléphone dans le projet !!!!! Doh! Le passage à la graisse "correcte" a résolu le problème.
Fattie

Réponses:


179

Vous pouvez essayer l'une des solutions suivantes pour déterminer la cause:

  1. recherchez les IBDesignablesAgentCocoaTouchjournaux dans ce répertoire: ~/Library/Logs/DiagnosticReportset voyez la cause.

Remarque: pour l'utilisateur avec Catalina: recherchez IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Allez dans l'éditeur -> Déboguer la vue sélectionnée tout en sélectionnant votre @IBDesignable UIViewdans votre storyboard, et voyez la trace de la pile.

  2. Supprimer le dossier Derive Data.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
    
  3. Nettoyez votre projet Shift + Command + Alt + K .

  4. Construisez votre projet Command + B .


35
En utilisant cette approche, j'ai pu découvrir que la raison était Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Je ne savais pas que les IBDesignablesAgentCocoaTouchappels de processus init(frame:), au lieu de init?(coder aDecoder:).
Yevhen Dubinin

5
@YevhenDubinin Merci, cela m'a aidé. Tout allait bien après la mise init(frame:)en œuvre dans ma sous
doraemon

2
Cela a résolu mon problème, mais j'ai dû quitter xCode avant de supprimer les données dérivées
Husam

2
la meilleure réponse init (frame :) est un problème courant
Michał Ziobro

1
Quittez xcode et effacez DerivedData. Cela a résolu le problème.
Mubashar

80

J'ai résolu le problème en procédant comme suit:

  1. Allez à File > Workspace settings.
  2. Cliquez sur la petite flèche droite à côté de "Données dérivées". Cela ouvre l'application Finder à l'emplacement du DerivedDatadossier.
  3. Allez dans le DerivedDatadossier et supprimez le dossier correspondant à votre projet.
  4. Quittez Xcode et rouvrez-le.
  5. Nettoyez votre projet shiftcommandk.
  6. construisez votre projet commandb.
  7. Ouvrez votre storyboard.
  8. Allez à Editor > Refresh all views.

Actualisé

Parfois, juste directement Aller à Editor > Refresh all viewstravaillé. Si Refresh all viewsest désactivé, quittez Xcode et réessayez.


Merci d'avoir posté ceci. J'ai fait une suppression de ligne de commande "old school" des données dérivées, mais le problème a persisté. L'utilisation de votre méthode a résolu le problème pour moi.
Adrian

Actualisez toutes les vues pour la victoire pour moi également. Merci!
Mike K.

56

Je supprime simplement la vue qui a échoué et appuyez sur commande + Z pour annuler la suppression. Ça marche pour moi.

Si vous modifiez ultérieurement la vue ayant échoué, l'erreur peut se reproduire, recommencez l'opération ci-dessus.


6
C'est ridicule mais ça a marché.
Ansari

1
Impressionnant!! A travaillé pour moi
Nupur Sharma

1
Qui sait que cela pourrait être la réponse. Cela a fonctionné, je ne peux toujours pas croire
Asad Amodi

37

J'ai rencontré ce problème dans CocoaPod 1.5.0. La solution consiste à réinstaller le pod (installation du pod à nouveau) une fois cette erreur affichée ou vous pouvez utiliser CocoaPod 1.4.0 à la place. Cela fonctionne bien dans 1.4.0 (du moins pour moi.)

mettre à jour:

Ajouter le script suivant dans Podfile m'aide à résoudre le problème dans la version 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

référence: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


100% vrai. la rétrogradation à la version 1.4.0 a résolu le problème pour moi.
ale_stro

4
Travaillé, 1.5.0 dosettes.
Andrey Oshev

3
il se s work for me, you should add termine au dernier du code.
mahdi

1
A travaillé pour moi aussi. J'ai essayé toutes les autres suggestions sans succès. Testé avec Pods 1.3.1
Sal

18

L'ajout du code suivant à ma @IBDesignableclasse a fait l'affaire.

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

Cela fonctionne pour moi. En fait, j'ai ajouté deux remplacements pour l'extension UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Ensuite, reconstruisez et avertissement (erreur) disparu. Pas même besoin de nettoyer le dossier de construction.
John Pang

Merci! Bonne réponse)
JiosDev

13

Pour toute personne -comme moi- qui ne peut pas trouver ce IBDesignablesAgentCocoaTouchfichier ou qui essaie de 'Déboguer les vues sélectionnées' de l'éditeur obtient une erreur, voici une autre façon de déboguer ces erreurs "Échec du rendu".

Ouvrez l'application 'Console', dans la barre latérale, sélectionnez votre Mac actuel (il sera probablement sélectionné automatiquement par défaut), puis dans la barre de recherche, recherchez "IBSceneUpdate" et appuyez sur Entrée.

De cette façon, chaque fois que vous obtenez une erreur Xcode pour IBDesignablene pas pouvoir effectuer le rendu, vous obtiendrez également une nouvelle entrée "IBSceneUpdate" avec plus de détails sur l'erreur.

C'est du moins ainsi que j'ai pu déboguer mes IBDesignableerreurs!

Application console affichant des erreurs IBSceneUpdate


1
L'application est une console réelle plutôt qu'un terminal, tout comme un FYI.
Carl Upton

Bonne prise! J'ai modifié ma réponse.
Stelabouras

12

Si vous utilisez un fichier xib pour uiview personnalisé. Essaye ça:

Changer de

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

À:

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

8

Essayez de désactiver 'Utiliser les variations de traits' (panneau Identité et type) pour tout fichier xib que vous pourriez avoir pour les vues personnalisées utilisées dans votre storyboard.


7

mon problème a été résolu en supprimant les dossiers (qui sont liés à ce projet) du dossier de données dérivées. vous pouvez le faire en cliquant sur Fichier -> Paramètres du projet -> puis cliquez sur le signe de flèche deside /Users/.../Xcode/DerivedData cliquez sur le dossier DerivedData vous verrez votre projet nommé dossiers supprimer ceux. quittez xcode pour ouvrir votre projet, nettoyez le projet en utilisant cette étape Product-> clean puis construisez le projet: Product-> Build Ceux-ci résoudront ces problèmes.


4

Bonne réponse fournie par @Maria :

vérifier le rapport de plantage à ~/Library/Logs/DiagnosticReports

Voie alternative :

  1. ouvert Spotlight

entrez la description de l'image ici

  1. type console.app

entrez la description de l'image ici

  1. sélectionner Crash reports

entrez la description de l'image ici

  1. vérifiez-en un IBDesignablesAgent-iOSet examinez le journal des incidents

L'utilisation de la console m'a aidé à résoudre mon problème. Des messages beaucoup plus détaillés que ce qui était dans Xcode.
Andrew Moore le


3

J'ai essayé de nettoyer et exécuter le projet ne résoudra pas ce problème.

Mais Fermer et rouvrir le projet l'a fait.


2

Lorsque j'ai débogué cela, j'ai découvert qu'il existe des classes qui modifient l'interface utilisateur. Typiquement marquelabel qui est une sous-classe de UILabel ou de toute autre classe sous-classant UIView et dessinant l'interface utilisateur au moment de l'exécution et en collision avec le moteur Autolayout. Essayez de donner une largeur ou une hauteur fixe pour ces vues personnalisées. Si cela ne résout pas votre problème, essayez les solutions suivantes: -

Solution 1: - Décommentez #use_frameworks dans votre fichier pod.

Solution 2: - Essayez de supprimer les données dérivées

  1. Fermez la fenêtre de l'éditeur de votre Xcode et quittez le simulateur ->
  2. Allez dans Préférences Xcode -> Emplacements ->
  3. Cliquez sur la petite flèche grise montrant le chemin des données dérivées ->
  4. Sélectionnez votre projet ->
  5. Supprimer tous les dossiers à l'intérieur ->
  6. Quittez Xcode et rouvrez

1
Pourriez-vous expliquer comment cela résout réellement le problème?
Paula Hasstenteufel

cela a résolu le problème mais je ne sais toujours pas pourquoi utiliser_frameworks parce que c'est pour un projet rapide à droite
Abhishek

Mon Podfile utilise déjà des frameworks, des suggestions passées sans commenter cela?
mmr118

@ moni15 j'ai ajouté une autre solution possible. Vérifiez s'il vous plaît.
Ashish Pisey

Décommenter #use_frameworks dans le fichier pod et effacer les données dérivées a fonctionné pour moi.
Jugal Desai

2

J'ai eu le même problème et je suis venu ici pour essayer de comprendre ce qui s'était passé. J'ai remarqué la réponse la mieux notée et la réponse elle-même ne m'a pas aidé, car IBDesignable n'existait pas dans le dossier du journal et j'ai déjà essayé toutes les autres options, mais dans les commentaires, j'ai remarqué que quelqu'un parlait d'un init frame.

J'ai décidé d'essayer de commenter mon extension IBDesignable pour UIView et cela a instantanément résolu le problème. Donc, pour résoudre ce problème, recherchez l'extension à l'origine du problème et assurez-vous de configurer les inits requis en créant une classe IBDesignable et en fournissant les initialiseurs requis comme suit:

@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() {
}
}

IMPORTANT: n'oubliez pas d'ajouter la nouvelle classe à l'élément sur lequel vous utilisez le designable.


1
Comme le dit sa documentation, n'oubliez pas d'appeler super.prepareForInterfaceBuilder () dans votre implémentation de prepareForInterfaceBuilder ().
Jaime S

1

Face à la même erreur: avait personnalisé UITextField et utilisé le générateur d'interface, l'erreur dans la console était -Utilisation de l'initialiseur non implémenté 'init (frame :)' pour la classe "CustomField"

Ajout de l'initialiseur pour corriger l'erreur


1

J'ai fait face à ce problème après la mise à jour vers la dernière version de XCode. Après avoir essayé plusieurs solutions décrites ci-dessus, je n'ai fait que Xcode, puis j'ai arrêté le système et l'allumer et cela a fonctionné pour moi.


0

Après avoir apporté les modifications nécessaires, changez le storyboard ou dans mon cas un .xib pour ouvrir dans "XCode 7", enregistrez et fermez. Il ne s'agit que d'une mesure provisoire pour corriger les erreurs, mais vous devrez finalement les corriger ou le faire jusqu'à ce que vous ne soyez plus en mesure de le faire.


0

Dans mon cas, j'utilisais une bibliothèque qui faisait des sous-classements UIView. Il utilisait IB_DESIGNABLEet manquait d'appels [super awakeFromNib]. Une fois que j'ai ajouté l'appel à cette méthode, le bogue a disparu.

Je ne sais pas si le fait qu'il soit mis en œuvre a IB_DESIGNABLEeu un impact là-dessus .


Où avez-vous ajouté le code pour [super awakeFromNib]? Pouvez-vous partager votre code?
TheJeff

0

C'est le moyen le plus simple pour moi: ajoutez ce script à votre 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

La source:

Cette solution de contournement pour @IBDesignable peut être trouvée ici: https://github.com/CocoaPods/CocoaPods/issues/5334

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.