2009-09-15 7 views
3

J'ai une question au sujet de la sous-vue de UIViewController, je créé un MainView de sous-classe UIView, qui a la taille exacte de l'écran, je me demande ce qui est une meilleure façon d'ajouter MainView, tenez compte des facteurs suivants:UIViewController: définir self.view sur ma vue ou ajouter ma vue en tant que sous-vue?

1 Comme cela a MainView Même taille que l'écran entier, le MainView lui-même peut avoir des sous-vues, mais il n'y a pas de vues au niveau de sauvegarde comme MainView (ie je n'ai pas besoin d'ajouter d'autres sous-vues à self.view).

2 Si j'utilise self.view = mainView, est-ce que je mets le code dans loadView (comme la méthode viewDidLoad signifie que la vue (selfview) est déjà chargée)? Je vois que la méthode loadView est mise en commentaire par défaut, si j'ajoute le code à cette méthode, quel autre code ai-je besoin de mettre ensemble (par exemple initialiser d'autres aspects de l'application)?

3 Si j'ajoute mainView via [self addSubview: mainView], y a-t-il deux tampons hors écran? Un pour self.view, un pour mainView, les deux ont la même taille que l'écran et l'un est superposé sur l'autre (ce qui gaspille de la mémoire)?

Merci beaucoup!

Répondre

1

Je résoudrais tout cela en le faisant dans un xib! Si vous créez un UIView dans votre xib, vous pouvez alors changer sa classe (quand vous sélectionnez l'UIView il devrait y avoir un champ de texte dans la section Identité de classe de l'inspecteur d'identité * - taper 'MainView' ici!)

Ensuite , créez votre contrôleur de vue en appelant

myViewController = [[MainViewController alloc] initWithNibName:@"MyNibName" bundle:nil]; 

Cela devrait résoudre vos problèmes; il est le principal sous-vue de votre contrôleur de vue (directement accessible à partir self.view) et vous n'avez pas à vous soucier de l'utilisation de la mémoire, il n'y a qu'une seule vue :)

Sam

NB * Cliquez sur Outils -> Identité Inspecteur. Je ne savais pas que ça s'appelait ça jusqu'à ce que je devais écrire cette réponse!

+0

De cette façon peut fonctionner, mais avoir un problème en fonction de différents périphériques, tels que l'iPhone 3.5, 4.0, et iPad etc. – Forrest

2

Je ne suis pas sûr de comprendre complètement ce que vous demandez, mais je vais essayer de répondre à quelques-unes de vos questions. Tout d'abord, si vous avez plusieurs UIViews à l'écran, ils sont tous chargés en mémoire. Vous devez faire -removeFromSuperview et les libérer pour récupérer la mémoire.

Vous pouvez affecter votre UIView en tant que vue du UIViewController. Par exemple:

MainView *mainView = [[MainView alloc] initWithFrame:CGRectMake(320.0, 480.0)]; 
self.view = mainView; 
[mainView release]; //since the .view property is a retained property 

Dans ce cas, vous avez le code d'initialisation de la vue dans la méthode -init. Juste une redéfinition comme:

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
       //initializations 
     } 
     return self; 
} 
+0

... correct ^, et mes deux cents ci-dessous. ;-) – sfjava

1

Vous devez implémenter loadView si vous avez fait initialiser votre contrôleur de vue avec un NIB. UIViewController prend soin de dimensionner correctement sa vue "principale". Ceci est tout ce que vous devez faire:

- (void)loadView 
{ 
    UIView* mainView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; 
    self.view = mainView; 
} 
0

Oui, le premier extrait de code ci-dessus est l'approche « standard », autant que je sache, quand ne pas utiliser (! Mal) fichiers NIB - à savoir quand votre alloc'ing voir dans le code, via loadView.

note, il semble qu'on peut aussi sortir avec ce qui suit, au lieu de coder en dur la taille écran rect:

UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
self.view = myView; 
[myView release]; 

Notez que vous certainement veulent faire [Communiqué myView] appel puisque, en effet, comme indiqué ci-dessus, self.view (pour UIView) est une propriété retenue.

Cheers, -dk

0

Peut-être la chose la plus importante à faire est de vous assurer que vous avez les éléments suivants:

self.view.userInteractionEnabled = YES; 

Bien qu'il ne soit pas nécessaire tout le temps, il résout le problème où self.view ne répond pas. Ce problème apparaît occasionnellement.