Boucle infinie lors de la substitution initWithCoder
J'ai un UIViewController
avec certains contrôleurs et des vues. Deux de ces points de vue (Cellule de la Grille) sont d'autres plumes. J'ai des points de vente à partir des Cellules de la Grille de Propriétaire du Fichier, mais ils ne sont pas chargés automatiquement.
J'ai donc essayer de remplacer GridCell.m
's initWithCoder
.
Cela démarre une boucle infinie.
Je sais que c'est possible de simplement remplacer initWithFrame
et ajouter la sous-vue à partir du code, mais ce n'est pas ce que je veux. Je veux être en mesure de déplacer le point de vue dans Interface Builder et Xcode initialiser le point de vue avec le cadre de droite.
Comment dois-je procéder pour atteindre cet objectif?
EDIT 1
Je suis en train de le faire fonctionner avec l'aide d'Alexandre. C'est de cette façon, j'ai maintenant le configurer:
MainView a UIView avec une classe Personnalisée définie comme GridCell. Il a obtenu une prise de courant dans le MainView/Propriétaire du Fichier.
Supprimé tous init-code de GridCell.m et mettre en place un exutoire à ma classe personnalisée
La MainView n'a pas encore d'afficher la GridCell bien. Il n'y a pas d'erreur, juste un solitaire, l'espace vide où l'interrupteur rouge devrait être. Ce que je fais mal?
Je suis très proche de juste le faire par programmation. J'aimerais savoir comment ce avec des plumes si.
[NSBundle loadNibNamed]
renvoie uneBOOL
!- Merci pour votre réponse. NSBundle loadNibNamed returnes un tableau auquel j'ai eu le premier objet de: développeurs d'Apple
- Ah bon j'ai été à la recherche à l'OS X de référence 🙂
Vous devez vous connecter pour publier un commentaire.
Chargement de la plume causes initWithCoder être appelée de nouveau, de sorte que vous ne voulez le faire si le sous-classe ne dispose pas actuellement toutes les sous-vues.
UIView
sous votre vue personnalisée.this class is not key value coding-compliant for the key myLabel
. Aucune idée pourquoi?Chargement d'une plume entraîne le correspondant du propriétaire dans un
appel
Donc de votre coude dans cette méthode:
va provoquer à nouveau un appel de la initWithCoder méthode. C'est parce que vous essayez de charger la plume de nouveau. Si vous définissez une coutume UIView et de créer un fichier nib, pour exposer son sous-vues vous ne pouvez pas simplement ajouter une UIView à une autre plume de fichier, changer le nom de la classe de l'IB à votre classe personnalisée et attendre la plume système de chargement de la figure.
Ce que vous pourriez faire est la suivante:
Votre vue personnalisée mine du fichier doit avoir le "propriétaire du Fichier" classe de régler votre affichage personnalisé en classe et vous devez avoir une prise de courant dans votre classe personnalisée appelé "toplevelSubView" relié à un point de vue dans votre affichage personnalisé plume fichier qui agit comme un conteneur pour tous les sous-vues. Ajouter d'autres points de vente à votre vue de la classe et de connecter les sous-vues de "propriétaire du Fichier' (personnalisé de votre UIView). (Voir https://stackoverflow.com/a/7589220/925622)
MODIFIER
Bon, pour répondre à votre édité question que je voudrais faire ce qui suit:
Aller à la plume de fichier où vous souhaitez insérer la vue personnalisée avec elle mine du fichier layouting il.
Ne pas le faire à la vue personnalisée (GridCell) lui-même, au lieu de faire un afficher qui contiendra votre cellule de la grille (gridCellContainer par exemple, mais cela devrait être une UIView)
Personnaliser le initWithFrame méthode au sein de votre vue personnalisée comme vous l'avez fait dans initWithCoder:
Et puis, dans le viewController qui est le fileOwner pour le point de vue où vous souhaitez insérer votre affichage personnalisé (l'un avec le gridCellContainer vue) ne présente dans le viewDidLoad par exemple
Maintenant, tout devrait fonctionner comme prévu
La propriétaire du Fichier ne sera pas obtenir de l'appel à
lors du chargement d'un xib.
Cependant, toutes les vues définies dans l'xib obtiendrez un appel à
lors du chargement d'un xib.
Si vous avez une sous-classe d'une UIView (c'est à dire GridCell) définie dans un xib et aussi essayer de charger la même xib dans votre sous-classe de initWithCoder, vous allez vous retrouver avec une boucle infinie. Cependant, je ne peux pas voir ce qui sera le cas d'utilisation être.
Généralement de la conception de votre UIView sous-classe (c'est à dire GridCell) dans un xib, puis utiliser cette sous-classe en vue du contrôleur xib par exemple.
Aussi, ne peut pas voir un cas d'utilisation où votre vue personnalisée aura une sous-vue dans initWithCoder, c'est à dire
Sauf si vous voulez être en mesure de remplacer son point de vue de la hiérarchie sur la demande dans certains autres xib. Qui OMI suppose une dépendance externe (c'est à dire une hiérarchie définie dans un autre xib) et le genre de défaites le but d'avoir une réutilisables UIView en premier lieu.
Bare à l'esprit que lors du chargement d'un xib, en passant d'une instance comme le propriétaire du Fichier, aura toutes ses IBOutlet(s) ensemble. Dans ce cas, vous serait de remplacer soi-même (c'est à dire GridCell) avec tout ce que la vue racine dans ce GridCell.xib est, de perdre tous IBOutlet connexions dans le processus.
Il y a un message plus détaillé sur "Comment mettre en œuvre une réutilisables UIView." qui va dans le détail un peu plus que bien et je l'espère efface les choses.
loadNibNamed:: appellerons initWithCoder:
Pourquoi ne pas suivre ce modèle?
Ne
[super initWithcoder:coder]
faire les choses que vous voulez éviter?J'ai eu le même problème quand je suis en train de remplacer
initWithsomething
méthode, nous avons besoin deau lieu