UIButton avec IB_DESIGNABLE émet un avertissement d’atsortingbut d’exécution et ne s’affiche pas dans Interface Builder

J’exécute Xcode 6.1 et j’utilise déjà IB_DESIGNABLE avec IBInspectable pour un certain nombre de projets déjà, mais soudainement, cela ne fonctionne plus. J’ai créé des boutons sous-classés qui arrangent l’image et le titre verticalement centrés au-dessus l’un de l’autre et permettent à l’utilisateur de définir une largeur et une couleur de bordure via IB avec IBInspectable.

L’avertissement suivant est consigné et aucun aperçu de mon code n’est disponible dans drawRect:

warning: IB Designables: Ignoring user defined runtime atsortingbute for key path "spacingBetweenLabelAndImage" on instance of "UIButton". Hit an exception when attempting to set its value: [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key spacingBetweenLabelAndImage. 

Pourtant, le temps d’exécution qu’il rend comme je le prévoyais pour le rendre et il respecte également cet espacement personnalisé que j’ai ajouté via IB.

Voici le code du menubutton qui réorganise le bouton et le titre:

 #import "HamburgerButton.h" IB_DESIGNABLE @interface HamburgerImageButton : HamburgerButton @property IBInspectable CGFloat spacingBetweenLabelAndImage; @end 

La mise en oeuvre:

 #import "HamburgerImageButton.h" @implementation HamburgerImageButton - (void)drawRect:(CGRect)rect { [super drawRect:rect]; CGSize imageSize = self.imageView.frame.size; CGSize titleSize = self.titleLabel.frame.size; // Move the label left and the image right by half the width CGFloat leftInset = titleSize.width / 2; CGFloat rightInset = imageSize.width / 2; CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2; CGFloat topInset = imageSize.height / 2 + halfSpacing; CGFloat bottomInset = titleSize.height / 2 + halfSpacing; UIEdgeInsets imageInsets = UIEdgeInsetsMake(-bottomInset, leftInset, bottomInset, -leftInset); UIEdgeInsets titleInsets = UIEdgeInsetsMake(topInset, -rightInset, -topInset, rightInset); self.imageEdgeInsets = imageInsets; self.titleEdgeInsets = titleInsets; } @end 

Vous avez probablement remarqué qu’il hérite de HamburgerButton. Ce bouton de hamburger de base n’a pas d’image et ne dessine que la bordure autour du bouton. Ce bouton de hamburger de base a exactement le même problème: il ne dessine pas sa bordure dans drawRect dans IB et il a le même type d’erreurs. Voici ce code pour être complet:

 #import  IB_DESIGNABLE @interface HamburgerButton : UIButton @property IBInspectable CGFloat borderWidth; @property IBInspectable UIColor *borderColor; @end 

La mise en oeuvre:

 #import "HamburgerButton.h" #import  @implementation HamburgerButton - (void)copyInspectables { self.layer.borderWidth = self.borderWidth; self.layer.borderColor = self.borderColor.CGColor; } - (void)drawRect:(CGRect)rect { [self copyInspectables]; } @end 

Je ne comprends pas vraiment pourquoi cela lance un avertissement et rien d’autre. Je n’ai pas vraiment changé ce que j’ai fait. J’ai vérifié le storyboard, c’est iOS 7 et supérieur, destiné à fonctionner dans Xcode 6 (le plus récent).

Il se plaint de ne pas pouvoir trouver cette valeur sur UIButton et c’est un peu bizarre parce que je l’ai sous-classé.


Mise à jour: J’ai donc tout changé et cela a fonctionné. Maintenant, ça craque à nouveau, sans rien changer d’autre. Je pense qu’il y a un bug dans Xcode 6.1 …: /

J’ai beaucoup travaillé avec Live Views depuis ses introductions et comme beaucoup de nouvelles fonctionnalités dans Xcode au départ, il a quelques défauts. Pourtant, je l’aime beaucoup et j’espère qu’il sera amélioré dans les nouvelles versions.

Cause:

Les vues en direct fonctionnent avec les propriétés @property qui obtiennent une balise IB_Designable spéciale qui donnera aux atsortingbuts de classe UI supplémentaires auxquels elle peut accéder via les atsortingbuts d’exécution définis par l’utilisateur qui seront définis via l’inspecteur d’atsortingbuts. Vous verrez que toutes ces propriétés existent également dans l’inspecteur d’identité. La cause première du problème est qu’il ne peut plus mapper ces atsortingbuts d’exécution définis par l’utilisateur avec les propriétés exposées.

Dès que vous ouvrez un Storyboard ou un xib qui utilise IB_Designable, Xcode recomstack l’écran à chaque modification si vous avez activé “Actualiser automatiquement les vues”. Comme votre code influence également votre interface utilisateur, cela ne doit pas nécessairement être un changement d’Interface Builder en soi.

Avec des projets plus simples sur des machines plus rapides, cela fonctionne plutôt bien la plupart du temps. Avec des projets plus importants qui ont également plus d’IB_Designable, le processeur n’a tout simplement pas la capacité suffisante pour vous suivre et vous obtiendrez une sorte d’erreur de délai d’attente lors du rendu de l’interface utilisateur. Ceci est la cause de “l’avertissement: IB Designables: Ignorer l’atsortingbut d’exécution défini par l’utilisateur pour le chemin de clé” spacingBetweenLabelAndImage “sur l’instance de” UIButton “. Frapper une exception en essayant de définir sa valeur: [setValue: non compatible avec le codage de la valeur clé pour l’espacement des clésBetweenLabelAndImage. “ Erreur.

De plus, il ne mettra plus à jour votre interface utilisateur avec votre code personnalisé. Ce n’est pas un problème lorsque vous l’exécutez, car lors de l’exécution, il reflétera ces modifications.

Une autre cause peut être que votre code ne comstack simplement pas lorsqu’il essaie de comstackr en arrière-plan. Cela est inévitable lorsque vous travaillez sur du code, ce qui le déclenche fréquemment.

Solution:

Nous devons nous assurer que votre classe de vue personnalisée se comstack à nouveau pour que les propriétés puissent être définies avec succès via Interface Builder

  • Dans un storyboard, allez dans “Editor” dans le menu de la barre supérieure
  • désélectionnez “Actualiser automatiquement les vues” si elle était toujours activée
  • Fermez tous vos tabs de storyboard
  • Reconstruire le projet
  • Corrige toutes les erreurs de compilation, le cas échéant
  • Rouvrez votre storyboard.
  • Aller à “Editeur” à nouveau et cliquez sur “Actualiser toutes les vues”

Les avertissements doivent disparaître et si cela a fonctionné avant que vous voyiez à nouveau votre code de vue personnalisé.

Après un commentaire ci-dessous de sunkas: c’est toujours une très bonne idée de nettoyer soigneusement votre solution en cas de problèmes étranges qui persistent.

Comment j’ai personnellement résolu ce problème:

Dans l’inspecteur d’identité des atsortingbuts d’exécution définis par l’utilisateur, j’ai remarqué que j’avais un ancien élément IB_Inspectable que j’avais supprimé de mon code, mais qu’il était toujours là. Le supprimer avec le bouton – a éliminé cette erreur.

inspecteur d'identité

Essayez de changer votre déclaration ” CGFloat ” pour spacingBetweenLabelAndImage en ” NSNumber “.

Autant que je sache, vous ne pouvez pas appeler ” setValue: ” sur une variable de type C.

Si vous modifiez la déclaration de ” spacingBetwenLabelAndImage ” en NSNumber, vous devrez également modifier un peu de code:

 CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2; 

pourrait devenir quelque chose comme:

 CGFloat halfSpacing = (self.spacingBetweenLabelAndImage ? ([self.spacingBetweenLabelAndImage floatValue] / 2) : 0.0); 

(Je ne suis pas sûr à 100% s’il s’agit d’une traduction parfaite de la première ligne, mais je voulais montrer comment obtenir une valeur floatValue à partir d’un NSNumber)

J’ai utilisé la méthode Departamento B fournie mais cela n’a pas vraiment fonctionné. Cependant, j’ai corrigé mon problème en 1. Sélection des vues de bug du storyboard 2. En cliquant sur (Editeur – Déboguer la vue sélectionnée) J’espère que cela vous aidera

J’ai eu un problème similaire, mais j’ai effectivement supprimé la propriété de la classe et Interface Builder se plaignait toujours de la propriété manquante, difficile.

J’ai essayé beaucoup de choses, comme nettoyer, reconstruire … Mais rien n’a fonctionné!

Ce qui était vraiment résolu était un clic droit dans le fichier Storyboard, en sélectionnant “Ouvrir en tant que” puis “Code source”. Cela a ouvert le contenu XML du storyboard dans l’éditeur et j’ai pu rechercher des références à la propriété manquante jusqu’à ce que je trouve la section:

   ...  

Après avoir supprimé toute la section, j’ai enregistré le fichier et actualisé la vue dans Interface Builder. Maintenant, tous les avertissements ont disparu!

Si vous êtes certain de bien définir tous les parameters, et si vous avez importé d’autres SDK dans votre projet et que vous rencontrez ce problème, cochez «Frameworks et bibliothèques liés» dans Target – General.

Après avoir correctement lié certains frameworks SDK, l’erreur a disparu.

J’ai eu cette erreur, quand a deux cibles. Un avec mon projet principal et un autre avec la cible, où je détiens des classes modifiables (pour une construction plus rapide).
Le problème était que dans le storyboard il manquait un module.

entrer la description de l'image ici