2009-07-03 8 views
2

J'ai donc un NSTabView que je suis en train de redimensionner dynamiquement et de remplir avec des sous-classes NSView. Je voudrais concevoir les pages dans IB, puis les instancier et les ajouter à NSTabView. J'ai ajouté l'ajout programmatique de sous-classes NSView, mais je ne sais pas comment les concevoir dans IB, puis les instancier.Créer une sous-classe NSView dans Interface Builder, puis l'instancier?

Répondre

8

Je pense que je l'ai eu. Faites-moi savoir si ce n'est pas une bonne chose à faire.

J'ai créé un nouveau fichier xib, défini son propriétaire comme un NSViewController et défini sa "vue" sur la vue personnalisée que j'ai créée dans le xib.

Ensuite, vous avez juste besoin:

NSViewController *viewController = [[NSViewController alloc] initWithNibName:@"MyViewXib" bundle:nil]; 
NSView *myView = [viewController view]; 
+0

Je pense que vous vous en approchez. Mais je ne pense pas que vous devriez définir le FirstResponder comme NSViewController, vous devez définir le propriétaire de fichiers comme un NSViewController (et lier l'affichage IBOutlet du contrôleur de vue). –

+0

Oups, c'est ce que je voulais dire en fait, c'était le propriétaire du fichier. Je vais le corriger dans la réponse pour ne pas confondre les gens. – toastie

6

@toastie avait une très bonne réponse. Le mien est similaire, mais nécessite un peu plus d'explications. Supposons que vous ayez déjà un objet contrôleur et que vous ne souhaitiez pas instancier un nouvel objet contrôleur pour obtenir une vue, et disons que vous aurez besoin de plusieurs copies de cette vue (par exemple Par exemple, vous avez conçu un UITableViewCell personnalisé dans IB et vous voulez l'instancier encore et encore depuis votre UITableViewController). Voici comment vous pourriez faire cela:

  1. Ajoutez un nouvel IBOutlet à votre classe existante appelée "specialView" (ou quelque chose comme ça). Il peut également être utile de le déclarer comme une propriété (nonatomic, retain).
  2. Créer une nouvelle vue xib appelée "SpecialView", et construire la vue comme vous le souhaitez.
  3. Définissez le propriétaire du fichier de la vue comme objet de contrôleur.
  4. Définissez la sortie specialView du propriétaire du fichier comme nouvelle vue.
  5. Chaque fois que vous avez besoin d'une nouvelle copie de la vue dans votre code, vous pouvez simplement faire ce qui suit.

(texte gratuit pour obtenir le formatage fonctionne correctement)

NSNib * viewNib = [[NSNib alloc] initWithNibNamed:@"SpecialView" bundle:nil]; 
[viewNib instantiateNibWithOwner:self topLevelObjects:nil]; 
[viewNib release]; 
NSView * myInstantiatedSpecialView = [[[self specialView] retain] autorelease]; 
[self setSpecialView:nil]; 

Oui, il est un peu plus de code que d'autres façons, mais je préfère cette méthode simplement parce que la vue apparaît dans le IBOutlet désigné. Je conserve et libère la vue, parce que j'aime réinitialiser la prise à zéro une fois que j'ai la vue, de sorte qu'il peut être immédiatement prêt à charger une nouvelle copie de la vue. Je tiens également à souligner que le code pour cela est encore plus court sur l'iPhone, ce qui nécessite une ligne pour charger la vue, et pas 3 (comme sur le Mac). Cette ligne est simplement:

[[NSBundle mainBundle] loadNibNamed:@"SpecialView" owner:self options:nil]; 

HTH!

Questions connexes