2010-02-23 3 views
1

Je fais une application qui comprend le même groupe de boutons dans de nombreux contextes différents. Les boutons envoient leurs actions à un objet différent dans chaque contexte. J'aimerais pouvoir concevoir un seul NSView dans IB contenant les boutons, et ensuite pouvoir mettre des copies de cette vue à plusieurs endroits dans mes nibs, tout en maintenant le lien, afin que les changements se propagent. Je voudrais connecter chacune de ces instances à différents objets, et les boutons envoient leurs actions à tout objet auquel leur vue parent est connectée. J'ai pensé à créer une sous-classe de NSView qui, lorsqu'elle est chargée, se substitue à une autre vue qu'elle charge à partir d'un fichier nib, définissant l'objet connecté comme propriétaire du fichier, mais je ne suis pas convaincu que cette méthode soit la plus propre. Voici ma mise en œuvre de cette idée (qui -does- travail):bits d'interface réutilisables, conçu dans IB

@implementation AVNViewFromNib 

- (void)awakeFromNib 
{ 
    //Load the nib whose name is specified by the "nibFile" key 
    NSNib* viewNib = [[NSNib alloc] initWithNibNamed:[self valueForKey:@"nibFile"] bundle:[NSBundle mainBundle]]; 
    NSMutableArray* topLevelObjects = [NSMutableArray new]; 
    [viewNib instantiateNibWithOwner:relatedObject topLevelObjects:&topLevelObjects]; 

    //Find our replacement view in that nib 
    for (id currentObject in topLevelObjects) 
    { 
     if ([currentObject isKindOfClass:NSClassFromString(@"AVNReplacementView")]) 
     { 
      representedView = currentObject; 
      break; 
     } 
    } 

    //Copy appropriate properties from us to our representedView 
    [representedView setAutoresizingMask:[self autoresizingMask]]; 
    [representedView setFrame:[self frame]]; 
    [[self superview] addSubview:representedView]; 

    //We were never here. :) 
    [self removeFromSuperview]; 
    [viewNib autorelease]; 
} 

@end 

@implementation AVNReplacementView 
@end 

Est-ce la méthode la plus propre? Existe-t-il un moyen standard d'y parvenir?

Répondre

1

Vous pouvez créer la vue avec les boutons dans IB, puis faire glisser cette vue dans la fenêtre Bibliothèque et l'enregistrer. Le hic, c'est qu'il n'y a pas de "lien" entre eux; éditer un ne changera rien sur les autres.

Si vous le souhaitez, vous devez créer une sous-classe de NSView à la place.

Je pensais que la création d'une sous-classe de NSView qui, lorsqu'il est chargé, se remplace par une autre vue qui il charge à partir d'un fichier nib, définissant l'objet connecté en tant que propriétaire du fichier, mais je ne suis pas convaincu que c'est la plus propre méthode.

Cela pourrait fonctionner. Je ne pense pas que ce soit vraiment si sale; la raison init méthodes retourner un objet est qu'ils peuvent explicitement renvoyer un objet différent. Cependant, je ne suis pas sûr de la façon dont vous manipulez les vues de différents cadres, puisque la vue chargée aura n'importe quel cadre dans la plume.

Une autre façon serait de charger les boutons à partir d'une plume, mais vous auriez à ajuster leurs cadres avant de les ajouter comme sous-vues.

+0

Nasty qu'il ne garde pas un lien (mais en y réfléchissant comment le ferait-il). Mais tout simplement un conseil génial! Merci Peter! – bladnman