2009-06-18 5 views
2

J'ai le code ci-dessous dans mon RootViewController (qui est un UITableViewController). Ce code est exécuté lorsque l'on clique sur le bouton dans la barre de navigation, puis (dans le simulateur) la vue suivante est affichée. Toutefois, les sous-vues (UITextLabels, UIButtons) qui sont dessinées dans la vue gérée par TripDetailsController ne sont pas affichées. De plus, dans la barre de navigation en haut de l'écran, le bouton «Précédent» de la vue d'origine n'est pas affiché, mais lorsque je clique sur le côté gauche de la barre de navigation, elle revient à la vue d'origine.Les sous-vues ne sont pas chargées à partir de NIB avec initWithNibName

  • TripDetailsController.view est liée à la TripDetailsView (UIView) dans Interface Builder
  • TDCONTROLLER a une valeur, il semble que si elle est chargée
  • TripDetailsController est dans un fichier NIB séparé
  • Utilisation de l'iPhone SDK 2.2.1 (donc pas encore 3.0)

code:

TripDetailsController *tdController = [[TripDetailsController alloc] 
        initWithNibName:@"TripDetailsController" bundle:nil]; 
[self.navigationController pushViewController:tdController animated:YES]; 
[tdController release]; 

Dans la classe TripDetailsController j'ai ajouté la méthode viewDidLoad comme ceci:

code:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title = @"Reis Details";  

    NSLog(@"Subviews: %@", self.view.subviews); 
    UILabel *l = [self.view.subviews objectAtIndex:0]; 
    NSLog(@"Subview 0 bounds: %@", l.bounds); 
} 

Le journal des messages ne ci-dessous montrent que les sous-vues sont là, mais aussi que les limites ne sont pas définies:

code:

6/18/09 Jun 18, 2009 10:06:00 PM ReisAdvies[11226] Subviews: (
    <UILabel: 0x56f250>, 
    <UILabel: 0x56f5a0>, 
    <UILabel: 0x56f6b0>, 
    <UILabel: 0x56f780> 
) 
6/18/09 Jun 18, 2009 10:06:00 PM ReisAdvies[11226] Subview 0 bounds: (null) 

Dans Interface Builder l'onglet "taille des labels" ne présentent des valeurs pour X/Y/W/H. On dirait que je dois le déclencher pour faire des activités de mise en page, mais appeler layoutSubviews dans viewDidLoad() n'aide pas. Des idées ce qui pourrait être le problème ici?

Répondre

2

trouvé la solution, dans Interface Builder:

  1. Dans le fichier NIB je ne mentionnaient pas UIWindow, alors j'ai ajouté un UIWindow à la BNI fichier et connecté la sortie TripDetailsController.view à l'UIWindow nouvellement ajouté.
  2. propriété vue du propriétaire de Le fichier est connecté au TripDetailsView (UIView)
  3. classe propriétaire du fichier est réglé sur UIViewController

Maintenant, il fonctionne comme prévu.

Je ne suis pas sûr à 100% que ce soit «la façon» de le faire, mais au moins cela semble fonctionner pour moi.

+0

c'est le chemin, mais il aurait dû être fait automatiquement pour vous par xcode si vous le laissez générer le xib pour vous – slf

0

La façon dont vous naviguez vers la sous-vue semble généralement bien pour moi. La seule chose que je voudrais mentionner est votre message [TripDetailController -loadView]. Je n'ai jamais fait quelque chose comme ça. Normallement, je transfère simplement des informations d'état au contrôleur dépendant avant de l'ajouter au UINavigationController en utilisant les mécanismes standard (à savoir viewDidLoad) pour initialiser la logique du contrôleur.

Recevez-vous un message -viewDidLoad? Votre contrôleur est opérationnel à ce moment?

Il s'agit probablement d'un problème/type de câblage subtil quelque part dans votre projet.

+0

J'ai ajouté l'appel loadView car il a été suggéré comme solution possible. Cela n'a aucun effet ici, alors je vais l'enlever de la question originale. Oui, TripDetailsController dos reçoit le message viewDidLoad. Donc, je suppose que TripDetailsController est opérationnel quelque part. J'ai aussi le sentiment que c'est un problème de câblage subtil mais que je n'ai pas encore pu le voir ... – Gero

1

La première chose que je remarque dans votre code est que vous appelez une fonction comme:

tdController.loadView; 

Pour autant que je sache, qui ne peut être fait en c objectif. Vous devez l'appeler comme:

[tdController loadView]; 

De même, où faites-vous toute votre initialisation? Dans le "loadView", dans le "viewDidLoad"?

Essayez d'ajouter le contrôleur à l'écran avec quelque chose comme ceci (pousser Vues au lieu de ViewControllers):

[self.view insertSubview:tdController.view atIndex:0]; 

Le code ci-dessus suppose qu'il est exécuté dans un autre sous-classe UIViewController, qui charge le point de vue de votre contrôleur dans c'est propre vue en tant que sous-vue.

+0

J'ai essayé d'ajouter la vue comme vous l'avez décrite mais cela n'avait aucun effet (visible). – Gero

1

En outre, dans la barre de navigation en haut de l'écran, le bouton « retour » à la vue originale non représentée, mais lorsque je clique sur le côté gauche de la barre de navigation il ne retour à la vue d'origine .

Avez-vous défini un titre pour votre élément de navigation?

Par exemple, dans TripDetailsController viewDidLoad

self.navigationitem.title = @"trip detail"; 
+0

Quand je fais cela, le titre apparaît. Le reste des contrôles ne s'affiche pas. Je suppose que parce que j'ai mis en page la vue dans INterface Builder je n'ai plus besoin d'ajouter les UITextLabels etc. dans le code de la méthode viewDidLoad de TripDetailsControllers. Ou dois-je coder là aussi? Si oui, quelle serait la valeur de la conception de la vue dans Interface Buildes? – Gero

0

est ici ce qui a fonctionné pour moi ...

dépouillé fenêtre et ViewControl du fait et la XIB classe mon fichier de propriétaire de viewController, puis connecté vue propriétaire du fichier à mon avis.

-ce que la charge avec initWithNibName ...

Nouveau sur iPhone Dev et un peu frazzled par combien de façons je peux me pendre à IB.

Questions connexes