2010-10-15 21 views
0

Je travaille sur une application qui a trois contrôleurs de vue de la table dans une pile de navigation. Le contrôleur de vue racine et le second VC ont des barres d'outils, mais je veux ajouter un sous-vue à la deuxième vue contrôleur like this. (La couleur est juste là pour la visualisation.)Ajout UIView sous-vue de contrôleur de vue de la table unique dans la pile de navigation

Je veux ajouter la vue par programmation, puisque je n'ai pas été en mesure de le faire avec IB sans maux de tête majeurs. En ce moment, je suis en mesure d'obtenir un peu ce que je veux en dessinant un UIView dans le second contrôleur de vue comme celui-ci:

- (void)viewDidLoad { 
     [super viewDidLoad] 

     UIView *detailView = [[UIView alloc] initWithFrame:CGRectMake(0, 392, 320, 44)]; 
     detailView = [UIColor redColor]; 
     [self.navigationController.view addSubview:detailView]; 
     [detailView release]; 
} 

Le problème avec cette approche est qu'une fois que le UIView est chargé dans la deuxième vue contrôleur, il reste chargé et est dessiné dans le troisième et les contrôleurs de vue racine. J'ai essayé une variété de méthodes d'élimination du UIView, y compris la mise à zéro du DetailView dans viewDidUnload, appelant à removeFromSuperview didSelectRowAtIndexPath (qui a supprimé la vue de l'ensemble de la pile). J'ai également essayé d'ajouter la sous-vue à self.view, mais cela la pousse en dessous de la zone visible de la vue de la table, donc je dois faire défiler vers le haut pour la voir, et elle redescend quand je la lâche. De toute évidence, l'ajout de cette sous-vue au contrôleur de navigation n'est pas la meilleure façon de faire ce que je veux, mais je ne sais pas où aller à partir d'ici.

Répondre

2

Comme vous l'avez déjà découvert, vous ne devriez certainement pas atteindre la vue du contrôleur de navigation.

Vous voulez que votre SecondViewController être un UIViewController qui implémente l'UITableViewDelegate et UITableViewDataSource et dont la vue fixe le UITableView et le UIView que vous souhaitez utiliser pour votre stationnaire « pied de page » dans sa propre UIView principale.

Il est important de garder à l'esprit que UITableViewController est en fin de compte simplement une commodité pour créer un contrôleur de vue dont la vue est entièrement constituée d'un UITableView.

Quoi qu'il en soit, plutôt que d'essayer de mettre une pile de ce code en ligne dans cette réponse, vous pouvez le parcourir (ou svn co) à partir de this read-only svn repo.

REVISEE (maintenant que ce n'est pas minuit, mettre un peu de code/explication directement en réponse):

Pour que le contrôleur soit poussé sur la pile de navigation qui a besoin du pied de page créer une nouvelle classe à base UIViewController (Ne cochez PAS la boîte de dialogue 'UITableViewController sous-classe' dans la boîte de dialogue de sélection de modèle).

Ajoutez les variables d'instance pour UITableView et UIView qui doit être la vue de dessous supplémentaire.

@interface SecondViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 
    UITableView* tableView; 
    UIView* customFooterView; 
} 
@property (nonatomic,retain) IBOutlet UITableView* tableView; 
@property (nonatomic,retain) IBOutlet UIView* customFooterView; 
@end 

Dans IB ajouter un UITableView et UIView à la vue racine existante pour le contrôleur et les poser comme vous le souhaitez (probablement la peine de modifier les paramètres de redimensionnement automatique aussi si votre application peut être utilisée à la fois portrait et paysage) . Raccordez les deux vues aux points de vente définis pour eux dans le "Propriétaire du fichier" et assurez-vous également que vous connectez les propriétés UITableView's délégué et dataSource pour pointer vers le "Propriétaire du fichier". Ensuite, implémentez simplement les protocoles UITableViewDelegate et UITableViewDataSource en fonction de votre application.

Si vous souhaitez afficher l'ensemble de la vue "Pied de page" dans IB, allez tout droit. Sinon, vous pouvez facilement ajouter des éléments par programme dans viewDidLoad (et n'oubliez pas de le supprimer dans viewDidUnload).

1

Je ne sais pas quel comportement vous cherchez mais essayez un de ces:

  • affecter les DetailView à la propriété tableFooterView du tableview au deuxième VC.

  • Réduisez la hauteur de la vue de la table et ajoutez detailView à self.view.

+0

Une vue de pied de page ne fonctionnerait pas puisque la sous-vue doit toujours être visible, c'est-à-dire que la vue de la table devrait défiler derrière elle. –

+0

Vous devriez réduire la hauteur de la vue de la table ou si vous voulez vraiment qu'elle défile derrière elle, ajoutez le detailView à self.view puis faites '[self.view bringSubviewToFront: detailView]' (avant de le relâcher). – Anna

+0

Si j'ajoute la sous-vue à self, alors je l'attache à la vue de table, ainsi elle défile avec la vue de table. Je veux que la sous-vue soit stationnaire, juste au-dessus de la barre d'outils. –

2

Je n'aime pas l'approche. Vous devriez placer votre vue de table dans une autre vue, et mettre votre vue de détail ensemble dans cette vue. Malgré cela, je pense que vous pouvez supprimer votre vue dans la méthode viewWillDisappear de votre contrôleur de vue. Je remarque aussi que vous ne gardez pas votre detailView comme une variable privée, que vous devriez faire parce que vous devez faire référence lorsque vous le retirez plus tard (je me demande encore comment vous l'avez fait.)

Notez que viewDidUnload est appelé cas de déchargement de la vue (c.-à-d. libérant de son contrôleur), donc il n'est pas lié à la navigation.