2010-05-02 3 views
0

J'ai travaillé sur une application iPhone dans XCode et Interface Builder du type de projet Tab Bar. Après avoir obtenu une vue de table de sujets (secteurs d'activité) fonctionnant bien, j'ai réalisé que j'aurais besoin d'ajouter un contrôle de navigation pour permettre à l'utilisateur de percer dans une table de sous-sujets (sous-secteurs).Barre d'onglets et contrôleur de navigation: Où ai-je mal tourné dans mon câblage d'Interface Builder?

En tant que développeur vert Objective-C, c'était déroutant, mais j'ai réussi à le faire fonctionner en lisant diverses documentations essayant quelques options IB différentes. Ma configuration actuelle est un contrôleur de barre d'onglets avec l'onglet 1 comme un contrôleur de navigation et l'onglet 2 une vue plaine avec une vue de table placée dedans. Le câblage fonctionne: je peux me connecter lorsque des lignes de table sont sélectionnées et je suis prêt à pousser un nouveau contrôleur de vue sur la pile afin que je puisse afficher les sous-rubriques Vue de la table.

Mon problème: Pour une raison quelconque, la vue tabulaire du premier onglet est un délégué et une source de données du deuxième onglet. Cela n'a aucun sens pour moi et je n'arrive pas à comprendre pourquoi c'est la seule configuration qui fonctionne. J'ai d'autres problèmes que je crois causés par le câblage maladroit.

alt text http://i43.tinypic.com/30nap85.jpg

Voici le câblage:

  • Navigation Controller (secteurs) est un délégué de Bar Tab
    • Barre de navigation est un délégué de contrôleur de navigation (secteurs)
    • View Le contrôleur (secteurs) a une vue de Table View
    • Tableau (Navigation Controller (secteurs)) est un délégué du premier contrôleur Voir (Entreprises)
    • Tableau (Navigation Controller (secteurs)) est une prise dataSource de la première vue du contrôleur (entreprises)
  • Controller First View (entreprises)
    • First View (secteurs) Contoller a une vue Tableau
    • Tableau (en premier contrôleur de vue (entreprises)) n'est pas relié à une prise dataSource et n'est pas un délégué

Lorsque je clique sur les boutons de l'onglet et regardez l'inspecteur, je vois que la première L'onglet est correctement connecté à mon MainWindow.xib et le second onglet a sélectionné une plume appelée SecondView.xib. C'est dans le propriétaire du fichier de MainWindow.xib où j'hérite UITableViewDataSource et UITableViewDelegate (et aussi UITabBarControllerDelegate) dans le fichier .h, et dans le fichier .m où j'implémente les méthodes déléguées.

Pourquoi cette configuration ne fonctionne-t-elle que lorsque la vue de table de mon premier onglet (View Controller (Sectors)) est un délégué et une source de données du second onglet? Je suis confus: pourquoi ne pas avoir besoin d'être connecté à l'onglet activé par le contrôleur de navigation dans lequel la vue Table est vue (Navigation Controller (Sectors))? La vue de table vue sur le second onglet n'a ni dataSource ni n'est un délégué.

alt text http://i40.tinypic.com/15ri1ig.jpg alt text http://i44.tinypic.com/2dwete9.jpg

Je vais avoir du mal à obtenir un pushViewController au feu (self.navigationController est non nul, mais le nouveau View Controller ne charge toujours pas) et je pense que je dois travailler ce IB problème de câblage avant que je puisse résoudre pourquoi le contrôleur de navigation ne pas pousser un nouveau contrôleur de vue sur la pile.

if(nil == self.navigationController) { 
    NSLog(@"self.navigationController is nil."); 
} else { 
    NSLog(@"self.navigationController is not nil."); 
    SectorList *subsectorViewController = [[SectorList alloc] initWithNibName:@"SectorList" bundle:nil]; 
    subsectorViewController.title = @"Subsectors"; 
    [[self navigationController] pushViewController:subsectorViewController animated:YES]; 
    [subsectorViewController release]; 
} 

Répondre

0

La première chose qui me saute aux yeux est que le contrôleur de vue de votre onglet Secteurs est un UIViewController, au lieu d'un UITableViewController. Vous devez simplement supprimer ce contrôleur de vue entière et faire glisser un UITableViewController de votre bibliothèque dans IB et le déposer sur votre UINavigationController. Il viendra avec un UITableView déjà connecté comme vue, avec UITableViewController déjà défini comme source de données et délégué pour ce tableauView. Une fois que vous avez un UITableViewController dans votre NIB, vous devez alors changer son nom de classe dans l'inspecteur pour le nom d'une sous-classe UITableViewController que vous avez implémentée dans le code. Une autre chose: vous avez les relations dataSource et déléguer vers l'arrière lorsque vous déclarez que votre vue de table est "une source de données" et "est un délégué". Juste pour clarifier:

  • une tableView a une propriété DataSource qui pointe vers un objet qui implémente le protocole UITableViewDataSource (généralement une instance de la sous-classe UITableViewController).
  • a tableView HAS une propriété delegate, qui pointe vers un objet qui implémente le protocole UITableViewDelegate (généralement la même instance de sous-classe UITableViewController).
  • La classe UITableViewController implémente les protocoles UITableViewDataSource et UITableViewDelegate. Lorsqu'elle est correctement configurée, votre sous-classe UITableViewController personnalisée est la source de données et le délégué de sa tableView.
Questions connexes