Potrzebuję uzyskać NSIndexPath
dla niestandardowej komórki w UITableView
. Oto problem: wysyłam NSNotification
z mojej komórki niestandardowej do mojej UITableViewController
, gdy editingDidBegin
zostanie wywołana z UITextField
w mojej komórce niestandardowej. W moim UITableViewController
zmieniłem rozmiar UITableView
po rozpoczęciu edycji UITextField
, a następnie chcę, aby widok tabeli przewinął się do komórki, w której pierwsza odpowiedź to UITextField
. Ale nie mogę dowiedzieć się, jak zwrócić indexPath
komórki, w której edytowana jest UITextField
. Próbowałem na tak wiele sposobów, ale wciąż nie działa. Jednym ze sposobów jest taka: w mojej klasie cstomCell i wybierz wiersz używając [self setSelected:YES]
i w moim kontroler TV ówczesnego gdybym NSLog
rzędu [self.tableV indexPathForSelectedRow]
zawsze zwraca 0 mimo, że nie zawsze 0.Zwrócić NSIndexPath z komórki niestandardowej? (UITableView)
Odpowiedz
Dajcie komórce wartość jego właściwość tag
. Następnie można dostać że komórka przez wywołanie tej
UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue];
wtedy gdy masz komórkę można uzyskać NSIndexPath jak ten
NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell];
Skoro masz UITextField w niestandardowych komórki można umieścić cell.textField.delegate = self;
w metoda źródło danych
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
. W ten sposób nie będziesz musiał konfigurować NSNotification w Custom Cell. Również w tym samym sposobem można oznaczyć Zarówno komórkom pole tekstowe jak ten cell.textField.tag = indexPath.row;
i komórkę jak ten cell.tag = indexPath.row;
Teraz, gdy już ustawić delegata UITextField, można teraz umieścić tę metodę w swojej klasie UITableViewController
- (void)textFieldDidBeginEditing:(UITextField *)textField {
CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
}
Powyższa metoda delegowania UITextField powinna uzyskać wartość indexPath dla aktualnie wybranej komórki.
Lubię otagować komórki tak:
/* 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;
}
Innym sposobem jest przekazanie danych beginEditing użyciu niestandardowych delegata i obejmują model komórki, które można użyć, aby dowiedzieć się swoją ścieżkę w zależności od sposobu przechowywania danych.
Wyjazd mój projekt github, ma kodu do obsługi tego sprawę, a także zmiana rozmiaru za pomocą klawiatury i tabulatorem do następnej edycji komórki: https://github.com/andrewzimmer906/XCell
Twój projekt github to kompletny bałagan, co najmniej 20 błędów i ostrzeżeń podczas kompilacji. Czy mógłbyś podać mi trochę więcej kodu, związanego tylko z moim pytaniem? Mam otwartą nagrodę w wysokości 50. – JonasG
spróbuj tego kodu ..
- (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;
}
czy to (odpowiedź, że dałeś przed poniżej) nadal działa, jeśli masz wiele texfields w każdej komórce ?:
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];
Skoro masz UITextField
w swojej komórce niestandardowej można umieścić metodę cell.textField.delegate = self;
w metodzie źródła danych. Również w tej samej metodzie możesz oznaczyć zarówno pole tekstowe komórki, jak to komórka.textField.tag = indexPath.rząd; i komórka taka jak ta cell.tag = indexPath.row;
Teraz, gdy już ustawić delegata UITextField, można teraz umieścić tę metodę w swojej klasie UITableViewController
- (void)textFieldDidBeginEditing:(UITextField *)textField {
CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
Mam tableview z 8 komórek, w każdej komórce Mam 6 texfields, a także tableview jest dynamiczny, więc użytkownik może wstawić więcej komórek ... ale mam problem z zapisaniem tekstu wprowadzanego przez użytkownika w każdym texfield. Czy jest możliwe, że z "cell.textField.tag = indexPath.row", kontroler identyfikuje to pole, w którym się znajduję?
czy raczej nie po prostu dostałbyś jego "ramkę"? – aopsfan