2011-09-08 9 views
6

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)

+0

czy raczej nie po prostu dostałbyś jego "ramkę"? – aopsfan

Odpowiedz

14

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.

+0

Nie rozumiem, proszę podać więcej kodu. Nie ma związku między dwoma liniami kodu, proszę powiedz mi, gdzie umieścić wiersz kodu. – JonasG

+0

@Maxner Edytowałem swoją odpowiedź. Mam nadzieję, że rozwiąże wszelkie wątpliwości. – ms83

-1

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

+0

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

0

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; 
} 
0

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ę?