À l'aide de xib objet à l'intérieur d'un autre xib
Je suis de la conception à l'aide de l'IB, un bouton spécifique (avec des étiquettes,et imageView et d'autres trucs).
Je voudrais utiliser que xib objet (le bouton) dans un autre xib, où j'ai 6 objets de ce bouton.
Je sais que je peux le faire par programmation à l'aide de l'Identificateur de Classe, mais puis-je placer mon etiquettes et d'affichage de l'image, et de définir les valeurs par défaut et tout le reste dans le code.
Je me demandais si il est possible de faire la même chose en utilisant seulement l'IB ? (bien sûr, je serais toujours définir les valeurs dans le code, mais je veux positions des etiquettes/imageView et tout le reste pour être mis dans le xib)
Grâce
Modifier
Donc, je comprends ce que j'ai demandé au premier abord n'est pas possible.
Ce que je vais essayer maintenant est comme ça :
J'ai créé un ButtonTest.xib
.
À l'intérieur de la Xib j'ai une UIView et 3 sous-vues (2 etiquettes et un bouton).
Dans l'inspecteur, je mis la classe UIView à ButtonTest
.
À L'Intérieur De ButtonTest.m j'ai 3 points de vente pour chacun des sous-vues, qui-je me connecter au bureau de l'IB.
Prochaine j'ai un ButtonTestViewController.xib
.
À l'intérieur j'ai mis un point de vue et l'ensemble de la classe dans l'inspecteur ButtonTest
.
- Je me connecter à un myTextView
prise à l'intérieur de ButtonTestViewController.m
de classe ButtonTest
Maintenant, voici le code à l'intérieur de ButtonTestViewController.m viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"ButtonTest" owner:nil options:nil];
ButtonTest *mainView = (ButtonTest*)[subviewArray objectAtIndex:0];
self.myTextView = mainView;
}
Ce que j'espérais allait se passer, c'est que le point de vue dans ButtonTestViewController.xib allait devenir le point de vue que j'ai conçu dans ButtonTest.xib.
Ce n'est pas le cas. ce qui se passe est que le point de vue à l'intérieur de ButtonTestViewController.xib reste le même.
La peine de mentionner, c'est que si j'ajoute:
[self.view addSubview:mainView];
Il n'ajouter le nouveau point de vue, en plus de l'existant.
Une idée de comment faire ce que je veux ?
Finalement, je voudrais avoir 6 vues dans ButtonTestViewController.xib
, tous les ressemblerait le ButtonTest.xib modèle, et les etiquettes de valeurs seront définis dans le code.
Edit2
Ok, les gars, j'ai fait tout ce que vous avez dit et cela a fonctionné comme un charme.
Le seul problème que j'ai avec cette question, c'est quand la vue dans ButtonTestViewController.xib
est un peu plus gros, puis les afficher dans ButtonTest.xib
.
Lorsque cela se produit, L'étiquette sur le bouton rechercher extrêmement floue.
Quand ils sont tous les deux de la même taille, c'est du tout bon.
@ Ned - j'ai utilisé le code exact que vous posté dans mon InitWithCoder méthode, sauf que j'ai changé l'image de la phrase au présent :
self.bounds = mainView.frame;
J'ai essayé de jouer avec la mode de contenu de l'IB en essayant de le réparer, en vain.
Quand je fais l'utiliser comme vous l'avez posté, sens :
mainView.frame = self.bounds;
Ça ne marche pas à tous, et les deux vues des grandeurs restent les mêmes.
Ici j'ai essayé de jouer avec le resizeMask mais ne fonctionne toujours pas.
Et idée de comment résoudre ces 2 problèmes ?
Merci les gars!
Modifier 3
J'ai réussi à résoudre l'un des problèmes, le redimensionnement de la ButtonTestViewController.xib
à la ButtonTest.xib
taille d'affichage.
C'est ce que j'ai fait (en utilisant le code pour résoudre le flou question, pris de ici)
self.bounds = CGRectMake(0, 0, mainView.frame.size.width, mainView.frame.size.height);
CGRect overlay2Frame = self.frame;
overlay2Frame.origin.x = round(overlay2Frame.origin.x);
overlay2Frame.origin.y = round(overlay2Frame.origin.y);
self.frame = overlay2Frame;
L'autre problème, je n'arrive toujours pas à résoudre. la vue dans ButtonTest.xib juste ne pas obtenir un plus grand pour correspondre à l'autre point de vue.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire, et assez facilement. La façon dont je le fais c'est de créer une sous-classe UIView (disons que c'est appelé "Mavue.m" et "Mavue.h"), puis une plume appelé "Mavue.xib".
Tout d'abord, dans la plume, cliquez sur Propriétaire du Fichier, et de définir la classe de "Mavue". Cela fera en sorte IBOutlets/Actions à partir de votre classe jusqu'au bureau de l'IB. Ajouter un affichage de niveau supérieur (si ce n'est pas déjà fait) que votre vue principale, et ajouter d'autres éléments personnalisés (UILabels et UIImageViews) comme des sous-vues des principaux UIView.
Ensuite, ajoutez le code suivant, de sorte qu'il est appelé lorsque le Mavue est initialisé (rappelez-vous, si vous initialiser à partir d'une plume il va avoir initialisé via - (id)initWithCoder:(NSCoder *)aDecoder).
Ce que ce n'est charges le point de vue de la hiérarchie à partir de votre plume dans le NSArray, et puisque vous n'en avaient un haut niveau de UIView, vous avez juste à ajouter que comme une sous-vue de votre personnalisé UIView.
Ceci vous permet de concevoir UIViews (et d'autres sous-classes de UIView) dans Interface Builder.
EDIT: mise à Jour de l'OP de la modifier.
La façon dont je l'ai toujours fait, c'est en premier en suivant mes indications ci-dessus. Une différence est que dans votre ButtonTest plume, vous décidez de changer la classe de l'UIView à ButtonTest, mais je change le Propriétaire du Fichier de la classe de ButtonTest. Puis, à l'intérieur
ButtonTest.m
, ne leloadNibNamed
choses. Maintenant, pour ajouter cet objet àButtonTestViewController.xib
, ajoutez une UIView (ou UIButton, quelle que soit ButtonTest est sous-classé) et changer la classe de ButtonTest.C'est un peu déroutant, donc je vais essayer de le casser en place par fichier.
ButtonTestViewController.xib
: Ajouter un UIButton (quel que soit le ButtonTest hérite de) et de changer la classe de ButtonTestButtonTest.m
: À l'intérieur de la "initWithCoder" la méthode, tous les "loadNibNamed" de choses que j'ai ci-dessusButtonTest.xib
: Changer le Propriétaire du Fichier de classe à ButtonTest et relier toutes les IBOutlets et IBActionsinitWithCoder
appelloadNibNamed
crée une boucle infinie, comme @Johnus indiqué ci-dessus. Toutes les idées sur la façon de se débarrasser d'elle?Certains d'entre vous le demandez dans les commentaires si cette solution n'est pas de créer une boucle infinie et je n'ai pas assez de réputation pour réponse, voici donc ma réponse:
La boucle exister que si la racine de la vue dans votre XIB a Personnalisé "classe" ensemble pour Mavue. Cela provoque la situation où la vue chargée de XIB invoque l'initialiseur de Mavue nouveau et, par conséquent, crée une boucle infinie. La solution est de "classe Personnalisée" doit être UIView et uniquement du Propriétaire du Fichier de classe doit être définie à Mavue (pour être en mesure d'attribuer IBOutlets et IBActions).
Swift 3.0
créer swift fichier avec classe
créer Xib fichier avec vue:ViewXIBfileClassView
créer wrapper de vue de la classe
ajouter une extension à UIView
Utilisation UIView avec ViewWrapper à l'intérieur de tous les Xib fichiers que vous souhaitez
Si votre classe est une sous-classe de UIButton par exemple, vous pouvez ouvrir la Bibliothèque dans Interface Builder et il sera sous l'onglet classes lorsque vous effectuez une recherche pour vous et vous pouvez faire glisser et déposer.
Vous pouvez aussi simplement faire glisser/déposer un UIButton et définir sa classe dans la fenêtre inspecteur.
Cependant, parce que vous avez votre propre .xib qui pourrait mess it up, auquel cas il suffit de m'ignorer.