Utilisation correcte de loadView et viewDidLoad avec UIViewController sans nibs / xibs

Quand je programme sans plume, j'ai l'impression que je dois appeler loadView pour initialiser ma vue, comme ceci:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        // Custom initialization
        [self loadView];
    }
    return self;
}

(j'ai défini nibNameOrNil = nil, car il n'y a pas de nib.)

Ensuite, j'ai configuré la vue, comme ceci:

- (void) loadView {
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 367)];
    [self viewDidLoad];
}

C'est faire tout le reste dans viewDidLoad.

Je ne suis toujours pas sûr si je suis censé faire les appels à loadView et viewDidLoad de cette façon. Ils ne sont pas appelés automatiquement.

Ce qui est déroutant est dans le documentation pour la référence de classe UIViewController:

Discussion LoadView

Vous ne devriez jamais appeler cette méthode directement. le contrôleur de vue appelle cette méthode lorsque la propriété view est demandée mais est actuellement nulle. Si vous créez vos vues manuellement, vous devez l'utiliser pour créer vos points de vue.{[19] } Si vous utilisez Interface Builder pour créer vos vues et initialisez le contrôleur de vue - c'est-à-dire que vous initialisez le afficher à l'aide de la méthode initWithNibName:bundle:, définir le nibName et nibBundle propriétés directement, ou créer à la fois vos vues et vue contrôleur dans Interface Builder-alors vous ne devez pas remplacer cela méthode.

Donc, je ne comprends pas comment loadView est appelé si Je ne devrais jamais l'appeler directement.

L'implémentation par défaut de cette méthode recherche une plume valide informations et utilise ces informations pour charger le fichier nib associé. si aucune information nib est spécifié, l'implémentation par défaut crée un objet UIView simple et en fait la vue principale.

Je ne comprends pas comment cela fonctionne - la création d'un UIView de douleur.

Si vous remplacez cette méthode afin de créer vos vues manuellement, vous devez le faire et attribuer la vue racine de votre hiérarchie au vue de la propriété. (Les vues que vous créez doivent être des instances uniques et ne doit pas être partagé avec un autre objet de contrôleur de vue.) Votre personnaliser la mise en œuvre de cette méthode ne devrait pas appeler super.

Si vous souhaitez effectuer une initialisation supplémentaire de vos vues, faites ainsi, dans la méthode viewDidLoad. Dans iOS 3.0 et versions ultérieures, vous devriez également remplacez la méthode viewDidUnload pour libérer toutes les références vue ou de son contenu.

Ok, jusqu'à présent, il ne dit pas comment viewDidLoad est appelé. Donc, pour viewDidLoad:

ViewDidLoad Discussion

Cette méthode est appelée après l' contrôleur de vue a chargé son les vues associées dans la mémoire. cette méthode est appelée indépendamment de indique si les vues ont été stockées dans un fichier nib ou créées par programme dans la méthode loadView. Cette méthode est le plus souvent utilisé pour effectuer des étapes d'initialisation supplémentaires sur les vues chargé de plume fichiers.

Appelé par quoi?

Puisque ces méthodes ne sont pas appelées automatiquement dans mon code, je suis laissé à penser que je dois les appeler moi-même. Mais je ne comprends toujours pas clairement dans la documentation que c'est la bonne chose à faire.

24
demandé sur Draco 2012-01-16 09:48:19

2 réponses

Comme le dit la documentation, Vous ne devriez pas appeler ces méthodes vous-même.

La façon dont cela est censé fonctionner est que le code D'UIKit appellera votre méthode loadView si et quand il a réellement besoin de présenter la hiérarchie de vue de ce contrôleur à l'écran.

Plus précisément, si un code tente de lire votre propriété view sur votre contrôleur de vue, et que cette propriété est nil, alors le code de UIViewController appellera la méthode loadView. Si vous n'implémentez pas loadView vous-même, alors le l'implémentation par défaut reviendra à tenter de charger la hiérarchie de vue à partir de la plume.

Tout cela se produit automatiquement lorsque vous essayez de présenter votre contrôleur de vue et que la vue est nulle. (Cela peut se produire plusieurs fois pendant que votre application est en cours d'exécution si votre contrôleur de vue doit décharger sa vue en réponse à la pression de la mémoire, un autre comportement que vous obtenez pour 'free' et que vous ne voulez pas vous appeler)

Si ces méthodes ne sont pas appelées dans votre contrôleur de vue, ensuite, il doit y avoir quelque chose de mal avec la façon dont vous présentez ce contrôleur de vue, ce qui empêche le code framework dans UIViewController d'appeler ces méthodes. Poste le code et quelqu'un peut vous aider à comprendre ce bug.

Avant d'essayer de corriger ce bogue, Cependant, vous devez les supprimer de votre code:

[self loadView]
[self viewDidLoad]

Et puis dans votre propre implémentation de viewDidLoad, vous voudrez appeler l'implémentation de la superclasse avec [super viewDidLoad]

Tu te souviens que dans loadView votre seule responsabilité de définir soi-même.voir une vue valide . C'est tout. Le code UIKit verra alors cela et appellera viewDidLoad pour vous.

J'espère que ça aide.

33
répondu Firoze Lafeer 2012-01-17 19:59:03

La réponse par Firoze Lafeer est correct, je veux juste montrer comment charger de force la propriété vue de la correcte:

(void)self.view;

Vous ne devriez pas faire cela! Si vous devez, vous faites quelque chose de mal, mais n'appelez pas -loadView et -viewDidLoad vous-même en aucune circonstance.

7
répondu Tricertops 2013-02-27 12:39:08