par programme de chargement de l'objet de la sous-classe de NSView de plume
Comment puis-je charger correctement un objet qui est une sous-classe de NSView à l'aide d'un Xib?
Je veux être chargés dynamiquement pas depuis le début, j'ai donc fait un Mavue.Xib
De MyDocument.m j'ai fait:
MyView *myView = [[MyView alloc] initWithFrame:...];
[NSBundle loadNibNamed:@"MyView" owner:myView];
[someview addSubview:myView];
...
et le fond est très bien (il appelle drawrect: et il se dessine comme prévu)
mais tous les boutons que j'ai mis sur le xib ne s'affiche pas.
J'ai vérifié, et ils sont chargés MAIS leur superview n'est pas le même objet que myView
.
Pourquoi est-ce? Je pense que je suis absent quelque chose dans le Xib, mais je ne sais pas exactement quoi.
En d'autres termes: Comment faire en sorte que la vue de la racine dans mon xib est le même objet que propriétaire du fichier?
Je souhaite qu'il y ait quelque chose de semblable pour le mac:
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; //in iOS this will load the xib
MyView* myView = [ nibViews objectAtIndex:1];
[someview addSubview:myView];
...
Merci d'avance.
MODIFIER
Je pense que j'ai compris l'origine du problème...(??)
Dans Mavue classe j'ai divers IBOutlet qui est connecté correctement au bureau de l'IB c'est pourquoi ils chargent très bien (je peux les renvoyer). Cependant il n'y a pas de IBOutlet pour la vue de dessus. Alors, quand NSBundle charges de la plume, la vue de dessus est affectée à un autre objet. Je pensais que ce sera le cas si j'ai mis ma vue de dessus de l'IB à partir de la classe:MyView
et mettre myView
en tant que propriétaire dans [NSBundle loadNibNamed:@"MyView" owner:myView];
mais il ne semble pas être le cas.
Ce que je fais mal?
- Essayez de les déplacer vers l'avant peut-être qu'il tire dans le dos et ne peut pas être vu à cause de l'arrière-plan
- J'ai juste essayé... qui n'est pas le cas ;(
- Dans votre fichier nib, est-il un affichage de niveau supérieur dont la classe est
MyView
? Existe-il d'autres objets de plus haut niveau dans le fichier nib? Et quelle est la classe du propriétaire du fichier? - Dans ma plume: Propriétaire du Fichier de classe est
MyView
le haut, il est actuellement de classeNSView
mais j'ai essayé aussiMyView
. Ni travaillé
Vous devez vous connecter pour publier un commentaire.
Remarque que d'une plume fichier contient:
MyView
;Scénario 1:
NSNib
Considérons que votre plume fichier n'a qu'un objet de plus haut niveau dont la classe est
MyView
, et le propriétaire du fichier de classe estMyAppDelegate
. Dans ce cas, en considérant que la plume fichier est chargé dans une méthode d'instance deMyAppDelegate
:Il regarde comme le premier argument de
-[NSNib instantiateNibWithOwner:topLevelObjects:]
peut êtrenil
de sorte que vous n'avez pas à spécifier un propriétaire, puisqu'il semble que vous n'êtes pas intéressé d'en avoir un:Bien que cela fonctionne, je ne voudrais pas compter sur elle car elle n'est pas documentée.
Noter que vous avez la propriété de haut niveau des objets, par conséquent, vous êtes responsable pour les libérer quand elles ne sont plus nécessaires.
Scénario 2:
NSViewController
Cacao fournit
NSViewController
pour gérer les vues; habituellement, les vues chargées à partir d'un fichier nib. Vous devez créer une sous-classe deNSViewController
contenant selon les prises sont nécessaires. Lors de l'édition de la plume de fichier, régler laview
prise et selon d'autres points de vente que vous avez défini. Vous devez également définir la plume propriétaire du fichier, de sorte que sa classe est présente sous-classe deNSViewController
. Alors:NSViewController
charge automatiquement le fichier nib et définit le correspondant de points de vente lorsque vous l'envoyer-view
. Alternativement, vous pouvez le forcer à charger le fichier nib en l'envoyant-loadView
.MyView
qui a été créé avant la plume fichier est chargé. Notez que cela implique que cette instance a été créée par programmation ou chargé à partir d'un autre fichier nib, différente de Mavue.nib.UIViewController
, et pas une sous-classe deUIView
.MyView
?self
(il n'est pas clair quelle est la classe deself
, et il a été créé avant la plume fichier a été chargé) et l'objet de plus haut niveau estmyView
— ils sont différentes objets. Même si vous spécifiez la même classe, les instances ne sont pas les mêmes.self
?Vous pouvez vous référer à cette catégorie
https://github.com/peterpaulis/NSView-NibLoading-/tree/master
J'ai trouvé la réponse par @Bavarious très utile, mais il est encore nécessaire squirrelling de ma part de le faire travailler pour mon cas d'utilisation - charge de plusieurs xib de définitions de vue dans un "conteneur" de la vue. Voici mon travail:
1) Dans le .xib, créer la vue de l'IB comme prévu.
2) NE PAS ajouter un objet pour le nouvel affichage du viewController, mais plutôt
3) Définir le .xib du Propriétaire du Fichier à nouveau de la vue viewController
4) Connectez tous les points de vente & les actions à Propriétaire du Fichier, et, plus précisément,
.view
5) Appel loadInspector (voir ci-dessous).
Ici est une façon d'écrire à la NSView sous-classe de sorte que la vue elle-même est entièrement à partir d'une autre xib et a tout mis en place correctement. Il s'appuie sur le fait que
init
pouvez modifier la valeur deself
.Créer une nouvelle " vue " xib à l'aide de Xcode. Définir le Propriétaire du Fichier de la classe de NSViewController, et de définir sa
view
prise pour cible de votre point de vue. Définir la classe de la vue cible à votre NSView sous-classe. Mise en page de votre vue, connectez les prises etc.Maintenant, dans votre NSView sous-classe, de mettre en œuvre désignés initialiseurs:
Et la même chose avec
initWithCoder:
de sorte qu'il fonctionne également lors de l'utilisation de votre NSView sous-classe à une autre xib.}