2010-03-30 4 views
17

Qualcuno può dirmi come posso ottenere una cella IndexPath? Stavo salvando IndexPath nella tabellaView: cellForRowAtIndexPath: metodo ma questo si carica solo quando viene visualizzata la cella e ho bisogno di conoscere il suo percorso dell'indice sul metodo viewDidLoad. questo ha comportato un valore nullo perché, come ho detto, carica solo il suo valore dopo che la cella è stata visualizzata una volta.UITableView Cell IndexPath

Grazie.

EDIT

L'intento è quello di poter passare a una cella specifica che ha il suo numero specifico ma non è lineare con le sezioni e righe contano.

+1

Perché avete bisogno l'indexPath nel metodo viewDidLoad? –

+0

perché ho bisogno di saltare a una specifica posizione della cella sul mio tavolo, che non so in quale posizione sarà. –

+0

Sono confuso.In che modo le sezioni e le righe contano per uno specifico elemento di dati in una tabella non lineare? Se non è lineare, come viene visualizzata una tabella lineare? – Giao

risposta

18

Utilizzare il metodo indexPathForCell: sul tableView, dato un puntatore ad un UITableViewCell restituisce la sua indexPath.

È possibile inserire lo scrollToRowAtIndexPath:atScrollPosition:animated: nel metodo viewWillAppear se non è ancora impostato in viewDidLoad. Questo è comunque un posto migliore se la vista può apparire più di una volta dopo essere stata caricata, ad esempio quando un controller della vista modale richiama le dimissioni.

+1

Il problema è che la cella è riutilizzabile e non è visibile o istanziata prima di tableView: cellForRowAtIndexPath: viene chiamato così non ho alcun riferimento alla cella. Dato che sto chiamando il numero di riga 0 della sezione 5 sto creando IndexPath e lo sto usando in scrollToRowAtIndexPath: atScrollPosition: animated: Sono bloccato con questa brutta soluzione, quindi se hai un'idea migliore per favore condividila. –

+1

Bene, se non sai su quale cella vuoi scorrere, e non sai quale percorso indice (riga/sezione) vuoi scorrere, sembra che tu non possa farlo. Questo potrebbe non essere applicabile, ma nel mio caso ho tutte le celle in un NSArray, quindi posso scorrere fino a qualsiasi cella, ma in quel caso non ne sto riutilizzando nessuna. – progrmr

+0

Grazie per la vostra pazienza –

2

A UITableViewCell non ha una proprietà NSIndexPath. Il delegato UITableViewDataSource definisce i metodi che richiedono una cella per un dato NSIndexPath, ma ciò non significa che la cella abbia una relazione permanente con una proprietà NSIndexPath.

Forse sarebbe d'aiuto se spiegassi più di cosa volevi questa proprietà? Che cosa vuoi fare con la posizione della cella in viewDidLoad?

+0

Voglio essere in grado di passare a quella cella specifica con scrollToRowAtIndexPath: atScrollPosition: animated: at sembra essere il modo corretto per farlo. –

+0

Ok, quindi creare una variabile 'NSIndexPath' e creare una copia per il proprio utilizzo in modo da poter chiamare tale metodo in futuro. – pkananen

+0

Questo è quello che ho. Il problema è che la variabile è solo istanziata quando la cella è costruita e se la cella non è visibile all'inizio non è costruita e questo valore è nullo –

0

Mi sembra che tu abbia risposto alla tua stessa domanda: non puoi. Poiché la cella non ha un indexPath quando viene eseguito viewDidLoad. E infatti, non ne ha neanche uno più tardi, perché la stessa cella potrebbe essere riutilizzata per essere a un altro indice entro un decimo di secondo, se si usa il dequeue delle celle (bella parola!), Che si dovrebbe.

MODIFICA: Ok, penso di vedere quello che vuoi: stai salvando il tuo IndexPath da qualche parte quando passi la cella al TableView. Nota: se non lo fai, non c'è modo di sapere in quale indexPath viene inserita una determinata cella, almeno non se stai facendo le cose come dovresti.

Quindi, ciò che puoi fare è semplicemente creare tutte le celle nel tuo metodo viewDidLoad, memorizzarle in un array, e poi, quando la tabella le chiede, passarle semplicemente da quella matrice.

Si noti che questo non è un buon modo per popolare una vista tabella, perché impedisce il riutilizzo delle celle. Un modo migliore sarebbe quello di salvare il contenuto delle celle (plain UIViews) nella matrice e aggiungerli come figli alla visualizzazione del contenuto della cella prima di restituire la cella. Ciò consentirebbe il riutilizzo delle celle, che è fondamentale per le buone prestazioni. Se non hai più celle di quelle che si adattano allo schermo, non devi preoccuparti di riutilizzarle comunque.

+0

Parte della tua risposta non è vera. In un secondo momento, dopo aver memorizzato il IndexPath di una cella specifica, posso ancora utilizzare IndexPath poiché viene fatto riferimento in un'altra posizione. –

+0

@Reonarudo: vedi modifica. – Felixyz

+0

Ok, forse non hai familiarità con ciò che sta accadendo. Quando memorizzo una cella IndexPath sarà sempre lo stesso valore anche se la cella è istanziata o meno. Si calcola con il numero di righe per sezione e il numero di sezioni os che mi viene dato dalla tabellaView: cellForRowAtIndexPath: e quando trovo le celle specifiche che voglio memorizzo solo la loro posizione, non ho intenzione di memorizzare tutte le celle perché sono molte. Forse l'approccio migliore sarebbe scrollare tutto verso il basso, salvando tutto l'IP e poi tutto su viewDidLoad? Cosa ne pensi. Grazie. –

1

Prova questo ..

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); 

chiamano in questo modo:

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