2011-09-08 2 views
6

Ho bisogno di ottenere il NSIndexPath per una cella personalizzata in un UITableView. Ecco il problema: invio uno NSNotification dalla mia cella personalizzata al mio UITableViewController quando editingDidBegin viene chiamato da un UITextField nella mia cella personalizzata. Nel mio , ridimensiono lo UITableView quando il UITextField ha iniziato la modifica, quindi desidero che la vista tabella scorra fino alla cella in cui è il primo risponditore lo UITextField. Ma non riesco a capire come restituire il indexPath della cella in cui è in corso la modifica di UITextField. Ho provato tanti modi, ma non funziona ancora. Un modo è questo: nella mia classe cstomCell i selezionare la riga utilizzando [self setSelected:YES] e nel mio controller TV, quindi se mi NSLog la fila di [self.tableV indexPathForSelectedRow] restituisce sempre 0 anche se la sua sempre non 0.Restituisce NSIndexPath dalla cella personalizzata? (UITableView)

+0

non preferiresti semplicemente ottenere il suo 'frame'? – aopsfan

risposta

14

solo dare la cella di un valore per la sua proprietà tag. Poi si può ottenere che il cellulare chiamando questo

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue]; 

poi una volta che hai il cellulare è possibile ottenere il NSIndexPath come questo

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell]; 

Dal momento che si dispone di un UITextField in cella personalizzato è possibile inserire cell.textField.delegate = self; in il metodo origine dati

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

. In questo modo non dovrai configurare NSNotification nella cella personalizzata. Anche in questo stesso metodo è possibile codificare sia le cellule campo di testo come questo cell.textField.tag = indexPath.row; e la cella come questo cell.tag = indexPath.row;

Ora che avete impostato il delegato UITextField, è ora possibile inserire questo metodo nella classe UITableViewController

- (void)textFieldDidBeginEditing:(UITextField *)textField { 

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag]; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];   

} 

Il metodo del delegato UITextField precedente dovrebbe ottenere il indexPath per la cella attualmente selezionata.

+0

Non capisco, per favore fornisci altro codice. Non c'è alcuna relazione tra le due linee di codice, per favore dimmi dove mettere quale riga di codice. – JonasG

+0

@Maxner Ho modificato la mia risposta. Spero che chiarisca ogni confusione. – ms83

-1

mi piace per codificare le celle in questo modo:

/* Create a tag based on the section and row of a cell(used to retrive the cell for the beginEditingNextCell method. */ 
-(NSInteger)tagForIndexPath:(NSIndexPath*)path { 
    return path.section * 1000 + path.row + 1; 
} 

L'altro modo è quello di passare i dati beginEditing utilizzando un delegato personalizzato e includono un modello cellulare, che è quindi possibile utilizzare per capire il vostro percorso a seconda di come stai memorizzando i dati.

controllare il mio progetto GitHub, ha il codice per gestire questo caso, così come il ridimensionamento per la tastiera e tabulazione alla cella successiva modificabile: https://github.com/andrewzimmer906/XCell

+0

Il tuo progetto github è un pasticcio completo, almeno 20 errori e avvertenze su build. Potresti fornirci qualche altro codice, solo in relazione alla mia domanda? Ho una taglia aperta di 50. – JonasG

0

provare questo codice ..

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    UITableView *tableView; 
    UITableViewCell* superViewCell = [self returnSuperCellViewOfTextField:textField]; 
    if(superViewCell)[tableView scrollToRowAtIndexPath:[tableView indexPathForCell:superViewCell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 

-(id)returnSuperCellViewOfTextField:(id)viewToCheck 
{ 
    id superView = [viewToCheck superview]; 
    if([viewToCheck isKindOfClass:[UITableViewCell class]] && superView)return superView; 
    else if(([viewToCheck respondsToSelector:@selector(superview)] && superView)) return [self returnSuperCellViewOfTextField:superView]; 
    return nil; 
} 
0

questo (la risposta che hai dato prima di seguito) funziona ancora, se si dispone di più texfields in ogni cella ?:

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue]; 
then once you have the cell you can get the NSIndexPath like this 

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell]; 

Dal momento che si dispone di un UITextField in cella personalizzato è possibile inserire cell.textField.delegate = self; nel metodo origine dati

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

. Anche in questo stesso metodo puoi taggare entrambi i campi di testo delle tue celle come this cell.textField.tag = indexPath.riga; e la cella come this cell.tag = indexPath.row;

Ora che avete impostato il delegato UITextField, è ora possibile inserire questo metodo nella classe UITableViewController

- (void)textFieldDidBeginEditing:(UITextField *)textField { 

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag]; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

ho un Tableview con 8 celle, e in ogni cella ho 6 texfields, e anche il tableview è dinamico, quindi l'utente può inserire più celle ... ma ho problemi a come salvare il testo che l'utente inserisce in ogni campo. È possibile che con "cell.textField.tag = indexPath.row", il controller identifichi il texfield in cui mi trovo?