2009-07-17 8 views
1

Modifié par souci de concision:objets Nib (subviews) l'accès aux propriétés dans ViewController

Comment propriétés d'accès dans son sous-vue superview et son contrôleur de vue de superview? Assez facile pour descendre la chaîne. Comment pouvons-nous remonter?

Original post (bavard):

Le problème immédiat, je suis en train de résoudre est de simplifier la « naissance » d'un point de vue quelque peu complexe. La grande image a à voir avec les Nibs et comment les sous-classes (de UIView en particulier) qui ont dépassé les initialiseurs triviaux sont reconstituées quand la vue se charge.

J'ai quelques UIViews personnalisés - sous-vues d'une sous-vue de la vue de mon viewcontroller. Quand j'instancie ces vues en particulier, elles ont besoin d'une référence à certaines propriétés (NSNumberFormatter, & NSDictionary) du View Controller.

CurrentY J'utilise une méthode pour les instancier:

- (id)initWithFrame:(CGRect)frame items:(NSDictionary *)dictionary forEditingMode:(EditingMode)mode 

J'expérimente avec les déplacer dans un Nib de les laisser se reconstituer et courir dans des problèmes de conception de base. Un être je pense que je suis limité à initWithFrame comme l'initialiseur par défaut?!? Si oui, comment ces objets peuvent-ils regarder dans le contrôleur de vue parent et obtenir une référence au dictionnaire et à d'autres propriétés?

Existe-t-il des méthodes que je pourrais appeler dans initWithFrame (similaires à celles qui récupèrent le délégué UIApplication) mais qui permettraient à la vue enfant d'envoyer des méthodes à ses vues parents et/ou contrôleurs?

Envoyez la police MVC, je suis sûr que je vais casser quelque chose ...

Répondre

0

Vous pouvez configurer les prises qui se connectés au contrôleur de superview ou vue de la vue et tirer l'info en awakeFromNib. Vous devez utiliser awakeFromNib au lieu de init* car les connexions ne seront pas créées jusque-là.

FYI, si vous instanciez via un Nib, votre initialiseur désigné est initWithCoder:, pas initWithFrame: (mais n'utilisez pas non plus pour cela).

+0

Donc vous dites mettre une IBOutlet dans ces sous-vues qui pointe vers le superview ou le viewcontroller? Je n'ai pas rencontré cela avant ... est-ce assez commun? – Meltemi

+0

C'est essentiellement le modèle de délégué.Vous donnez à la sous-vue une sortie nommée 'delegate', et un protocole de délégué (historiquement, ce serait informel, bien que vous puissiez maintenant utiliser un protocole formel avec des méthodes optionnelles). Ensuite, vous rendez la vue d'ensemble conforme au protocole. Enfin, vous le définissez comme délégué, soit dans IB, soit avec un message accesseur. –

+1

Yup, comme Peter l'a dit, votre contrôleur de vue devient essentiellement un délégué pour la sous-vue. Assurez-vous d'en faire une propriété 'assign' ou vous obtiendrez un cycle de conservation. –

1

Cela devrait fonctionner dans l'autre sens.

Les vues contiennent uniquement des contrôles (champs de texte, etc.). Les données résident dans un modèle, et les contrôleurs de vue/fenêtre servent de médiateurs, d'accès et de définition des valeurs des contrôles de vue, en synchronisation avec le modèle. OK, parfois vous devrez peut-être avoir un dictionnaire partagé entre le contrôleur et la vue. Créez ensuite une propriété de dictionnaire dans la vue et définissez-la dans la méthode awakeFromNib du propriétaire de la pointe.

0

Vous devriez probablement le faire manuellement via le contrôleur de vue juste après le chargement de la pointe. Cela signifie que vous devrez définir le dictionnaire partagé APRES la vue a été initialisée. Vous pouvez le faire comme ça:

@interface MyViewController : UIViewController { 
    IBOutlet MyView* view1; 
    IBOutlet MyView* view2; 
    IBOutlet MyView* view3; 
} 
@end 

@implementation MyViewController 

-(void) viewDidLoad; 
{ 
    NSDictionary* sharedDict = //make the shared dictionary here; 
    view1.sharedDict = sharedDict; 
    view2.sharedDict = sharedDict; 
    view3.sharedDict = sharedDict; 
} 

@end 
Questions connexes