UITableView

Paisible.frPaisible.fr Membre
22:53 modifié dans API UIKit #1
Bonjour,

Je commence à  jouer un peu avec le SDK iPhone. Il y a un truc sur lequel je bute un peu.
J'ai une UITableView que j'arrive à  peupler sans problème et à  gérer en revanche je n'arrive pas à  faire la même chose pour avoir plusieurs niveaux. L'idée est d'avoir l'équivalent d'un NSOutlineView.

Je n'arrive pas à  comprendre s'il faut jouer avec les "sections" (et comment ?) ou s'il faut créer une UITableView par niveau.

J'ai cherché des exemples sur le net et parcouru quelques exemples fournis par Apple mais rien d'approprier.

Quelqu'un peut-il me mettre sur la voie ? Merci.

Réponses

  • Philippe49Philippe49 Membre
    novembre 2008 modifié #2
    Jouer avec les sections : indexPath.section et indexPath.row

    NSArray * stringsInSection=[sections objectAtIndex:indexPath.section];
    cell.text=[stringsInSection objectAtIndex:indexPath.row];
  • 22:53 modifié #3
    Vous la trouvez pas chiante vous la Tableview pour iPhone ? Moi je trouve ça bof comparé à  celle de Mac OS X.. mais bon, l'avantage c'est surtout la "catégorisation" (Même si ça reste facile à  faire sur Mac quand même  ::) )
  • AliGatorAliGator Membre, Modérateur
    novembre 2008 modifié #4
    Il ne faut pas perdre de vue que sur iPhone, le design est légèrement différent de sur OSX.
    On a un écran plus petit, pas de multifenêtres, etc... ça nous oblige aussi à  penser autrement côté design.

    La UITableView ne permet pas de faire d'arborescences à  proprement parler comme on peut voir dans le Finder en mode Liste avec les petits triangles pour ouvrir un dossier et voir son contenu, indenté, sous le nom du dossier.
    La UITableView permet à  l'origine de faire des listes uniquement. Cependant, on peut couper ces listes en sections, pour éviter d'avoir une liste de 3km non stop, on peut avoir au milieu de la liste des petits en-têtes gris pour indiquer les sections. C'est ce que l'on retrouve dans l'application "Carnet d'Adresses" de l'iPhone où l'on voit la liste des contacts, mais découpée en sections d'après la première lettre, avec un petit en-tête "A" avant la liste de ceux dont les noms commencent par A, etc.
    On peut même y rajouter un index à  droite pour avoir la liste des sections sur la droite de la UITableView et pouvoir rapidement accéder à  une section.

    Ces 2 possibilités (sections et index sur la droite) sont propres à  la UITableView on ne les retrouve pas dans la NSTableView.


    Par contre pour mimer le comportement d'une NSOutlineView, il faut penser ça sur plusieurs écrans. Pour ça il faut voir avec les NavigationControllers. L'idée c'est d'avoir une "page" (un "écran iPhone") par niveau de l'OutlineView et non pas de tout caser sur la même vue. Après, il suffit de pousser un nouveau UITableViewController dans le NavigationController à  chaque fois que l'utilisateur clique sur une cellule de ta liste (UITableView) pour lui afficher le niveau hiérarchique suivant.
    Le NavigationController va se dévrouiller tout seul pour garder en mémoire dans sa pile de VC les tables représentant les niveaux intermédiaires, va te mettre aussi tout seul le bouton en haut à  gauche pour retourner au niveau hiérarchique précédent, etc.


    Pour plus d'infos, lire ici pour les NavigationControllers et Là  pour l'utilisation conjointe des NavigationControllers et des TableViewControllers
  • laurrislaurris Membre
    22:53 modifié #5
    Si on veut mimer le comportement de la NSOutlineView, on peut aussi voir les sections comme des enfants de la cellule selectionnée au niveau supérieur. C'est ce que je fais dans mon appli et ça marche. Dans ce cas, tout se passe dans -didSelectRow:row inSection:section : on recalcule le modèle pour que la section section+1 affiche les enfants et on recharge la table.
    Celà  étant, la performance a l'air bonne dans le simulator (avec 3 sections)mais je sais que reloadData est censé être assez gourmant et je n'ai pas testé sur le device.

    Pour voir un screencast d'une UITableView qui se comporte comme une NSOutlineView:
    http://pagesperso-orange.fr/cocoadev/filtereditor/Screencast.html
  • AliGatorAliGator Membre, Modérateur
    22:53 modifié #6
    Dis Laurris, c'est quoi l'avantage de a méthode, du moins ce que j'en comprends, à  savoir n'utiliser qu'un TableViewController et changer son contenu quand tu cliques, et du coup rajouter toi-même le bouton de retour qui va recharger le contenu précédent... donc avoir à  tout gérer à  la main parce que tu as une seule instance de ton TableViewController...?
    Alors qu'avec la méthode [tt]pushViewController:animated:[/tt] de UINavigationController, tout ça est fait tout seul, animation, stockage des vues dans une pile, gestion en cas de mémoire limitée, ajout du bouton pour remonter à  l'étape précédente... tout automatique, quoi ;) Ce qui ne t'empêche pas d'avoir qu'un seul NIB bien sûr
    Y'a sûrement un avantage à  ta méthode à  n'utiliser qu'un seul UIViewController et changer ses données et faire du reloadData derrière, mais j'avoue que je vois pas pour l'instant ;)
  • laurrislaurris Membre
    décembre 2008 modifié #7
    Hmmm, je ne sais pas si on est d'accord sur ce que fait ma méthode. As-tu regardé le screencast ? Ce dont je parle se trouve dans le dernier controller pushé , les 2 premiers ne comptent pas, d'où peut-être le malentendu.
    je n'ai pas de bouton de retour pour recharger, tout se passe dans une vue, une tableview et un controller. La racine de la outlineView-like est représentée par la première section de la tableview et ensuite on déroule dans les sections inférieures.

    • A                                                 A
      B                                                •B
          - Selection de B > reloadData ---->
    C                                                   E
    D                                                   F
  • AliGatorAliGator Membre, Modérateur
    22:53 modifié #8
    Ahh oui celle quand tu rajoutes une règle à  un filtre tu veux dire ? Et que tu choisis le critère, l'opérateur, et l'opérande, genre "Birthday" + "is" + "next week" ?
    Là  oui d'accord, je vois que tu fais le reloadData en effet, et pourquoi pas dans ce cas d'utilisation ça se comprend... Mais heu pour moi ça ne mime pas le comportement des NSOutlineView à  plusieurs niveaux hiérarchiques, ça...
  • laurrislaurris Membre
    22:53 modifié #9
    Disons que ça mime à  moitié. Ca mi-mime quoi.

    On a la hiérarchie avec la notion de noeuds comme pour la outline view. Par contre on ne peut pas visualiser plusieurs noeuds ouverts en même temps mais une hiérarchie à  base de UIViewControllers non plus.
Connectez-vous ou Inscrivez-vous pour répondre.