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.

Alan
la source
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 .

Maria
la source
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.

mnémonique23
la source
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.

Ryan.Yuen
la source
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

Jérôme Li
la source
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)
}
Mohammad Zaid Pathan
la source
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

Stélabouras
la source
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)
Hoàng Công Tùng
la source
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.

LatinCoder
la source
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.

Mitu Vinci
la source
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
gbk
la source
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

Ouvrez simplement votre storyboard -> Editeur -> Actualisez toutes les vues. Ce travail pour moi.

Anggara Siswanajaya
la source
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.

Lal Krishna
la source
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
Ashish Pisey
la source
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.

Nox
la source
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

Avinash
la source
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.

Mehsam Saeed
la source
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.

Alberto Lopez
la source
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 .

AnthoPak
la source
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

NFerocious
la source