2009-05-23 4 views
1

Lorsque je dois charger une vue programatically que je fais ce qui suit:Qui doit appeler viewDidLoad sur les vues chargées progammatiquement?

MyController* myController = [[MyController alloc] init]; 
[[NSBundle mainBundle] loadNibNamed:@"myNib" owner:myController options:nil]; 
// use my controller here, eg. push it in the nav controller 

Cela fonctionne très bien, mais viewDidLoad mon contrôleur est jamais appelé. J'ai donc décidé de l'appeler manuellement après l'appel de loadNibNamed, mais cela ne semble pas correct. Je m'attendais à ce que le framework appelle le viewDidLoad en mon nom. Est-ce la bonne façon ou il me manque quelque chose?

Répondre

3

vous devez charger les contrôleurs de vue avec

MyController* myController = [[MyController alloc] initWithNibName:@"myNib" bundle:nil]; 

Assurez-vous que votre MyController étend de UIViewController, et la propriété View est correctement défini dans Interface Builder.

1

Les vues sont chargées paresseusement par UIViewController. Si vous utilisez l'accesseur myController.view dans votre code, la vue doit être chargée et viewDidLoad appelée.

+1

Non, cela semble être le cas non plus. La vue chargée s'affiche correctement, mais viewDidLoad n'est jamais appelée. Je peux voir dans la pile du débogueur que sur un contrôleur 'ordinaire' chargé à partir d'une plume, viewDidLoad est appelé par la vue [UIViewController], mais ne semble pas s'appliquer aux contrôleurs 'faits à la main'. –

0

J'ai remarqué la même chose. Je pense que ViewDidLoad doit être appelé par la vue CONTROLLER. Comme vous n'avez pas de contrôle de vue dans votre plume, vous devez appeler viewdidload manuellement. Je dois faire la même chose

5

Je suis nouveau sur Stack Overflow, mais j'ai découvert cette question et découvert quelques autres méthodes pour charger un fichier nib qui s'assure que la méthode viewDidLoad est appelée automatiquement. est correct, mais il faut que vous sortiez du code de ViewController pour charger le fichier nib, ces deux exemples que je vous offre ici vous permettent de garder votre code dans l'implémentation de ViewController, pas forcément de meilleures façons, juste différentes. à le faire de cette façon, s'il vous plaît laissez-moi savoir vos pensées

d'abord, à l'intérieur du initWithNibName:. paquet: méthode de votre sous-classe UIViewController, vous pouvez remplacer l'appel:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

avec quelque chose comme ceci:
self = [super initWithNibName:@"NameOfAlternateNibFile" bundle:nibBundleOrNil];

Ou, vous pouvez accomplir ce qui semble faire exactement la même chose par ce qui suit:

[[NSBundle mainBundle] loadNibNamed:@"NameOfAlternateNibFile" owner:self options:nil]; 
[self setView:self.view]; //this line ensures that the viewDidLoad method is called 

La clé est de comprendre ce qui est écrit dans les commentaires au-dessus de la définition de fonction pour $initWithNibName:bundle: dans le fichier UIViewController.h (inclus au bas de ma réponse ici, voir italique). La bonne chose à faire à l'aide de l'une ou l'autre de ces méthodes est que viewDidLoad est appelé dans l'un ou l'autre scénario.

Voici les directives énumérées dans UIViewController.h:

L'initialisateur désigné. Si vous sous-classe UIViewController , vous devez appeler la super implémentation de cette méthode , même si vous n'utilisez pas de NIB . (Pour plus de commodité, la méthode par défaut init fera cela pour vous, et spécifiez zéro pour les deux méthodes arguments.Dans la NIB spécifiée, le proxy propriétaire du fichier doit avoir sa classe définie sur la sous-classe du contrôleur , avec la vue de sortie connectée à la vue principale. Si vous appelez cette méthode avec un nom nul nil , alors cette méthode de classe -loadView tentera de charger une NIB dont le nom est le même que celui de votre classe de contrôleur . Si aucune NIB en fait existe alors vous devez soit appel -setView: avant -view est invoquaient, ou remplacer la méthode -loadView pour configurer votre point de vue programatically. - (id) initNithNibName: (NSString *) nibNameOrNil groupe: (NSBundle *) nibBundleOrNil;

Questions connexes