Tuto : Une Nav-Bar dans un onglet de Tab-Bar

Philippe49Philippe49 Membre
juillet 2009 modifié dans Actualités #1
Une proposition d'architecture pour ajouter un UINavigationController dans l'un des view controller d'une Tab Bar.
Dans ce tuto très simple, tout est quasiment fait dans IB.

Page TabBar_NavBar

(à  partir de la discussion dans ce post)

Réponses

  • Philippe49Philippe49 Membre
    19:05 modifié #2
    Pour la suite, on envisage une pile de view controllers dans la partie navigation.

    Page TabBar_NavBar_2
  • muqaddarmuqaddar Administrateur
    19:05 modifié #3
    Superbe travail qui devrait m'être utile sous peu !
    Je te tire mon chapeau.
  • mefystomefysto Membre
    19:05 modifié #4
    Je suis débutant débutant et j'essaye de suivre ton tutorial pour apprendre un peu à  me servir de xcode et IB .
    Le problème étant que "Renseigner le champ NibName pour les deux view controllers et supprimer (éventuellement) la vue qui est mise pour le FirstViewController." Je ne sais pas quoi mettre , j'imagine FirstViewController et SecondViewcontroller
    Il faut creer FirstView.xib , ok mais bon pas d'info dessus ( j'ai réussi néanmoins à  le creer )
    "On y installe un UILabel pour vérifier le bon fonctionnement." J'ai mit dans  le fichier crée FirstView une "view" et un label mais impossible de les relier ensemble..

    Déjà  si tu pouvais m'aider sûr ça m'aiderais bien.

    Merci d'avance








  • Philippe49Philippe49 Membre
    avril 2009 modifié #5
    dans 1239772320:

    Le problème étant que "Renseigner le champ NibName pour les deux view controllers et supprimer (éventuellement) la vue qui est mise pour le FirstViewController."  Je ne sais pas quoi mettre , j'imagine FirstViewController et SecondViewcontroller

    NibName signifie le nom identifiant le xib associé au view controller.
    FirstViewController est configuré dans le xib  appelé FirstView
    SecondViewController est configuré dans le xib  appelé SecondView.
    Le champ Nib Name se trouve dans le panel attributes lorsqu'on sélectionne le FirstViewController et le SecondViewController dans le MainWindow.xib

    dans 1239772320:

    Il faut creer FirstView.xib , ok mais bon pas d'info dessus ( j'ai réussi néanmoins à  le creer )

    C'est une action élémentaire avec XCode.

    dans 1239772320:

    "On y installe un UILabel pour vérifier le bon fonctionnement." J'ai mit dans  le fichier crée FirstView une "view" et un label mais impossible de les relier ensemble..


    Tu ouvres la librairie (menu Tools)
    Dans le search field tu tapes UILabel.
    Tu fais glisser un UILabel sur ta vue.
    Tu double-cliques dedans et tu mets le texte que tu veux (ou tu ouvres le panel attributes du UILabel pour configurer cela)
    C'est tout. (vérifie l'arborescence comme indiquée sur la page du tuto)

    Il n'y a rien dans le fichier FirstViewController
  • iPatxiPatx Membre
    19:05 modifié #6
    Bonjour,
    J'ai un petit soucis, à  la fin de la première page du tuto.
    Voici l'erreur :
    [UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x524000
    2009-06-01 11:40:47.776 Maquette[1004:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x524000'

    Elle apparaà®t lorsque je veux accéder à  la deuxième vue.
    Savez vous d'ou cela peut venir ?
    Merci
  • Philippe49Philippe49 Membre
    19:05 modifié #7
    dans 1243849411:

    [UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x524000

    Ce message signifie que le message tableView:numberOfRowsInSection: a été envoyé à  un UIViewController qui n'implémente pas cette méthode.
    Vérifier dans IB que les Classes et Nib Name ont été correctement attribués (dans les trois fichiers xib).
  • iPatxiPatx Membre
    19:05 modifié #8
    J'ai repris étape par étape et ça marche nickel, merci.
  • iPatxiPatx Membre
    juin 2009 modifié #9
    Bonjour,
    J'essaye d'ajouter une barre de recherche dans le fichier SecondTable.xib, je crée donc une view dans laquelle je mets la barre de recherche ainsi que la TableView que j'avais déjà . Je ne sais pas  ensuite comment procéder pour que la barre s'affiche(pour le système de recherche il n'y a pas de souci, j'ai réussi à  le faire dans une application plus simple) :
    - Si je lie m'a nouvelle view avec le File's Owner il y a un souci au lancement (normal je pense car le File's Owner (de type TableViewController) attend une TableView et non une view).

    Pourriez vous me dire ou je me plante?
    merci

    Edit : voici l'erreur [UITableViewController loadView] loaded the "FirstTable" nib but didn't get a UITableView
  • Philippe49Philippe49 Membre
    19:05 modifié #10
    Difficile

    1) Une UISearchbar est une UIView. cela ne sert à  rien de la mettre dans une UIView. Il y a donc une UIView en trop dans cette interface.

    2) Déplacer une UISearchBar de la library vers la view du xib et non vers une view qui se trouve dans le xib. On doit voir dans IB la searchBar dans la vue principale du secondTableViewController.

    3) Créer un IBOutlet dans le code du SecondTableViewController

    @interface SecondTableViewController:UITableViewController {<br />&nbsp; &nbsp; &nbsp; UISearchBar * searchBar;<br />&nbsp; &nbsp; &nbsp; ....<br />}<br />@property (nonatomic,retain) IBOutlet&nbsp;  UISearchBar * searchBar;<br />...
    


    Ne pas oublier le @synthesize searchBar et le [searchBar release] dans le fichier .m

  • iPatxiPatx Membre
    19:05 modifié #11
    Merci beaucoup.


    Il me manquait le [self.view addSubView:searchBar] aussi ;)
  • groumpfgroumpf Membre
    19:05 modifié #12
    Merci beaucoup pour cet article, c'est exactement ce que je cherchais :)
  • Philippe49Philippe49 Membre
    19:05 modifié #13
    Depuis, la doc a été complétée : Combining Toolbar and NavigationControllers
  • grouikgrouik Membre
    19:05 modifié #14
    Hi,

    J'ai remarqué qu'en laissant visible la StatusBar (commenter les 2 lignes dans "applicationDidFinishLaunching"), la TableView (dans le SecondTableViewController) ne s'affiche pas entièrement mais semble "glisser" légèrement sous la TabBar du bas.

    J'ai fini par trouver une solution en jouant sur la TableView dans IB (TableView Size > ScrollView Size > Content > Inset > Bottom, et idem pour Scroller > Insets > Bottom, tous deux passé à  25 pour que ça marche). Mais je suis étonné que la TableView ne s'adapte pas toute seule à  son container. J'ai raté un truc ou bien est-ce normal. Ma solution est-elle "propre" ainsi ?

    Merci à  ceux qui pourraient m'éclairer là  dessus.
    Sinon, tuto très utile.

    --G
  • Philippe49Philippe49 Membre
    août 2009 modifié #15
    Cela vient de la frame du navigationController inséré dans la seconde vue.
    Le log donne {{0, 20}, {320, 460}} au lieu de {{0, 0}, {320, 460}}

    @implementation SecondViewController<br />@synthesize navigationController;<br />- (void)viewDidLoad {<br />	[super viewDidLoad];<br />	NSLog(NSStringFromCGRect(navigationController.view.frame);<br />	[self.view addSubview:[navigationController view]];	<br />}<br />
    


    Une solution par le code est
    <br />- (void)viewDidLoad {<br />	[super viewDidLoad];<br />	navigationController.view.frame=CGRectMake(0.,0.,320.,460.);<br />	[self.view addSubview:[navigationController view]];	<br />}
    

    Il reste que ceci n'est pas une explication de ce comportement bizarre.
    En prime, le proverbe du jour :
    Ce que IB ne fais pas pour toi, le code te le fera 

    On remarquera que dans la doc parue depuis, Apple supprime la secondView pour insérer directement le navigationController.


    Bienvenu sur PommeDev !    :p :p
  • grouikgrouik Membre
    19:05 modifié #16
    dans 1250149222:

    navigationController.view.frame=CGRectMake(0.,0.,320.,460.);
    ...

    Bienvenu sur PommeDev !


    Merci pour ces conseils avisés. Je vais tester. Je suis aussi rassuré de ne pas avoir compris/fait les choses de travers...  :o

    --G
  • AliGatorAliGator Membre, Modérateur
    19:05 modifié #17
    J'utiliserais [UIScreen mainScreen].applicationFrame moi plutôt que de mettre le rect en dur, non ?
  • 19:05 modifié #18
    dans 1250159897:

    J'utiliserais [UIScreen mainScreen].applicationFrame moi plutôt que de mettre le rect en dur, non ?

    T'as peur d'un TabletMac?  ;D
  • grouikgrouik Membre
    19:05 modifié #19
    dans 1250159897:

    J'utiliserais [UIScreen mainScreen].applicationFrame moi plutôt que de mettre le rect en dur, non ?


    Hi,

    No good, l'applicationFrame a un offset Y de 20 (hauteur de la StatusBar), du coup le phénomène persiste (en pire car j'ai une marge de 20 en haut).
    Il faudrait combiner les 2 comme ceci :

    CGRect newRect = navController.view.frame;
    newRect.size.height -= [UIScreen mainScreen].applicationFrame.origin.y;
    [navController.view setFrame:newRect];

    Merci à  vous...

    --G.
  • 19:05 modifié #20
    Y'a un moyen sans code de palier à  ces problèmes.. il suffit d'afficher la statusbar, navigation bar, et tabbar dans chacune de tes vues via IB. Enfin moi ça m'a supprimé tous les décalages et tutti quanti
  • grouikgrouik Membre
    19:05 modifié #21
    dans 1250169827:

    il suffit d'afficher la statusbar, navigation bar, et tabbar dans chacune de tes vues via IB.


    Désolé mais j'ai fait le tour de la question en reprenant le tuto à  zéro pour voir où j'avais m*rdé et en faisant aussi ce que tu suggères, sans succès. Je préfèrerais aussi ne pas coder ça, mais pour le moment je n'ai pas réussi autrement...

    --G.
  • AdauAdau Membre
    19:05 modifié #22
    Bah moi ça marche nickel avec la solution de Eaglelouk. (mais je n'ai pas suivi le tuto, j'ai tout fait par moi-même, peut-etre y'a-t-il une différence entre mon code et celui du tutorial).

    Essais quand même de persévérer de ce coté là .

    Adrien
Connectez-vous ou Inscrivez-vous pour répondre.