2010-03-30 7 views
17

Quelqu'un peut-il me dire comment obtenir une cellule IndexPath? Je sauvais l'indexPath dans la méthode tableView: cellForRowAtIndexPath: mais cela ne se charge que lorsque la cellule est vue et que j'ai besoin de connaître son chemin d'index sur la méthode viewDidLoad. cela a abouti à une valeur nulle parce que, comme je l'ai dit, il charge seulement sa valeur après que la cellule a été vue une fois.UITableView Cell IndexPath

Merci.

EDIT

L'intention est d'être capable de sauter à une cellule spécifique qui a son numéro spécifique, mais sa non linéaire avec les sections et les lignes comptent.

+1

Pourquoi avez-vous le indexPath dans la méthode viewDidLoad? –

+0

parce que je dois sauter à une position de cellule spécifique sur ma table, que je ne sais pas dans quelle position ce sera. –

+0

Je suis confus.Comment les sections et les lignes comptent-elles pour un élément de données spécifique dans une table non linéaire? Si ce n'est pas linéaire, comment une table linéaire est-elle affichée? – Giao

Répondre

18

Utilisez la méthode indexPathForCell: sur le tableView, donné un pointeur vers un UITableViewCell il retourne son indexPath.

Vous pouvez mettre le scrollToRowAtIndexPath:atScrollPosition:animated: dans la méthode viewWillAppear s'il n'est pas encore configuré dans viewDidLoad. C'est quand même un meilleur endroit si la vue peut apparaître plus d'une fois après avoir été chargée, par exemple quand un contrôleur de vue modale invoqué démissionne.

+1

Le problème est que la cellule est réutilisable et elle n'est pas visible ou instanciée avant que tableView: cellForRowAtIndexPath: est appelée donc je n'ai aucune référence à la cellule. Comme j'appelle le numéro de ligne 0 de la section 5, je crée l'indexPath et je l'utilise dans scrollToRowAtIndexPath: atScrollPosition: animé: je suis bloqué avec cette solution moche, donc si vous avez une meilleure idée, partagez-la. –

+1

Eh bien, si vous ne savez pas à quelle cellule vous voulez faire défiler, et ne savez pas quel chemin d'index (ligne/section) vous voulez faire défiler, il semble que vous ne pouvez pas le faire. Cela peut ne pas s'appliquer, mais dans mon cas, j'ai toutes les cellules dans un NSArray, donc je peux faire défiler vers n'importe quelle cellule, mais je n'en réutilise pas non plus. – progrmr

+0

Merci pour votre patience –

2

Un UITableViewCell n'a pas de propriété NSIndexPath. Le délégué UITableViewDataSource définit les méthodes qui demandent une cellule pour un NSIndexPath donné, mais cela ne signifie pas que la cellule a une relation durable avec une propriété NSIndexPath.

Peut-être que cela aiderait si vous avez expliqué plus de ce que vous vouliez cette propriété? Que voulez-vous faire avec l'emplacement de la cellule dans viewDidLoad?

+0

Je veux être en mesure de sauter à cette cellule spécifique avec scrollToRowAtIndexPath: atScrollPosition: animated: at semble être la bonne façon de le faire. –

+0

Ok, créez une variable 'NSIndexPath' et créez une copie pour votre utilisation afin de pouvoir appeler cette méthode dans le futur. – pkananen

+0

C'est ce que j'ai. Le problème est que la variable n'est instanciée que lorsque la cellule est construite et si la cellule n'est pas visible au début, elle n'est pas construite et cette valeur est nulle. –

0

Il me semble que vous avez répondu à votre propre question: vous ne pouvez pas. Parce que la cellule n'a pas un indexPath lorsque viewDidLoad est exécuté. Et en fait, il n'en a pas non plus un plus tard, car la même cellule pourrait être réutilisée pour être à un autre index dans un dixième de seconde, si vous utilisez la déqueueing de cellule (gentil mot!), Ce que vous devriez faire.

EDIT: Ok, je pense que je vois ce que vous voulez: vous enregistrez l'indexPath vous-même quelque part lorsque vous donnez la cellule à la tableView. Note: si vous ne le faites pas, vous ne pouvez pas vraiment savoir à quel indexPath une cellule particulière est placée, du moins pas si vous faites les choses comme vous le devriez. Par conséquent, vous pouvez simplement créer toutes les cellules de votre méthode viewDidLoad, les stocker dans un tableau, puis, lorsque la vue de table les demande, les transmettre simplement à partir de ce tableau. Notez que ce n'est pas un bon moyen de remplir une vue tabulaire, car cela empêche la réutilisation des cellules. Une meilleure solution serait de sauvegarder le contenu des cellules (UIViews simples) dans le tableau, et de les ajouter comme enfants à la vue du contenu de la cellule avant de renvoyer la cellule. Cela permettrait la réutilisation des cellules, ce qui est crucial pour de bonnes performances. Si vous n'avez pas plus de cellules que nécessaire, vous n'avez pas à vous soucier de les réutiliser.

+0

Une partie de votre réponse n'est pas vraie. Plus tard, après avoir stocké l'IndexPath d'une cellule spécifique, je peux toujours utiliser IndexPath car il est référencé dans un autre endroit. –

+0

@Reonarudo: Voir éditer. – Felixyz

+0

Ok, peut-être que vous n'êtes pas familier avec ce qui se passe. Lorsque je stocke une cellule IndexPath, il sera toujours la même valeur même si la cellule est instanciée ou non. Il est calculé avec le nombre de lignes par section et le nombre de sections os qui me sont données par le e tableView: cellForRowAtIndexPath: et quand je trouve les cellules spécifiques que je veux je stocke seulement leur position, je n'ai pas l'intention de stocker tous les cellules parce qu'ils sont trop nombreux. Peut-être la meilleure approche serait de faire défiler tout en économisant tous les IP, puis tout sur ViewDidLoad? Qu'est-ce que tu penses. Merci. –

1

Essayez celui-ci ..

NSSet *touches = [event allTouches]; 
UITouch *touch = [touches anyObject]; 
CGPoint currentTouchPosition = [touch locationInView:EventlistTable_obj]; 
NSIndexPath *indexPath = [EventlistTable_obj indexPathForRowAtPoint: currentTouchPosition]; 
NSLog(@"Selected row:%d in section:%d",indexPath.row,indexPath.section); 

Ne pas appeler comme ceci:

[cell.fourth_image_button addTarget:self action:@selector(Btn_pressed:event:) forControlEvents:UIControlEventTouchUpInside];