Question

Je pense que je manque quelque chose de fondamental et je veux demander à la communauté de l'aide. Je construis une application basée autour d'une application iPhone Utilitaire de base. Mon MainView et FlipsideView partagent certains éléments, donc je l'ai créé ViewControllers séparés et les fichiers nib pour ces pièces. Pour ce faire, je l'ai fait ce qui suit: 1. A créé un viewcontroller appelé searchDateViewController qui est le propriétaire du fichier de searchDateView.xib 2. searchDateView.xib est essentiellement un UIView avec un UILabel à l'intérieur, la vue est branché correctement 3. J'ajouter à la fois l'intérieur et MainViewController.m FlipsideViewController.m un sous-vue comme folllows:

- (void)loadView{
    [super loadView];
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil];
    [[searchDateViewController view] setFrame:[searchDateView frame]];
    [[self view] addSubview:[searchDateViewController view]];

...
}

Tout affiche et fonctionne très bien. Fondamentalement, en fonction des actions qui se passent dans chacun des principaux et Flipside vues le UILabel de la pointe est changée. Cependant, je voulais faire quelque chose de légèrement différent si le searchDateViewController est chargé à partir du MainView ou FlipsideView. Cependant, je ne peux pas à comprendre ce qui ViewController ajoute la sous-vue de searchDateViewController.

En searchDateViewController j'ai essayé:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"superview %@", self.view.superview);
    NSLog(@"parentviewcontroller %@", self.parentViewController);
}

Dans les deux cas, je reçois nulle.

Alors ma question est - ce que je peux savoir qui ViewController est l'ajout searchDateViewController un sous-vue? Si c'est le cas, comment? Ou si ma logique ici est complètement foiré, comment dois-je faire cela?

Merci!

Était-ce utile?

La solution

viewDidLoad est invoquée lorsque le contrôleur de vue a chargé son point de vue. Dans votre cas, que happends dans cette ligne:

[[searchDateViewController view] setFrame:[searchDateView frame]];

A ce moment-là, vous n'avez pas encore appelé addSubview: il est donc pas étonnant que la superview de la vue est nulle.

Pour résoudre votre problème, vous devez définir une propriété à l'intérieur SearchDateViewController de distinguer entre les différents cas. Cette propriété serait alors réglée en conséquence par le contrôleur parent qui crée l'instance SearchDateViewController.

En général, je ne pense pas que ce soit une bonne idée d'utiliser une sous-classe UIViewController comme contrôleur pour une vue qui est utilisé comme une sous-vue d'un ou plusieurs points de vue plein écran plutôt que d'être utilisé comme une vue plein écran lui-même. Une grande partie de la logique de UIViewController fonctionne sur l'hypothèse qu'il est utilisé pour gérer une vue plein écran. Par exemple, avec votre conception, je pense qu'il est possible que SearchDateViewController modifiera le cadre de la vue lorsque l'orientation de l'appareil change, etc. Puisque vous n'avez pas besoin de toute cette fonctionnalité pour une sous-vue non-plein écran, je vous suggère de sous-classe votre SearchDateViewController directement de NSObject .

Autres conseils

ViewController et vues sont complètement séparées.

Dans la plupart des cas, lorsque vous ajoutez un sous-vue à une vue parent ne pas ajouter son contrôleur à viewController du parent. L'exception à cette règle est le contrôleur de navigation qui ajoute le contrôleur au lieu de la vue de maintenir une hiérarchie de contrôleurs de vue.

Votre SearchDate viewController ne peut pas trouver un contrôleur de parent parce que vous n'attribué un et le système ne le fait pas automatiquement. Vous pouvez simplement assigner un contrôleur parent lorsque vous évoquez la vue d'un autre contrôleur.

searchDateViewController.parentController=self;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top