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)
risposta
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.
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
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
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;
}
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?
non preferiresti semplicemente ottenere il suo 'frame'? – aopsfan