Вернуть NSIndexPath из пользовательской ячейки?(UITableView) - PullRequest
7 голосов
/ 09 сентября 2011

Мне нужно получить NSIndexPath для пользовательской ячейки в UITableView. Вот проблема: я посылаю NSNotification из моей пользовательской ячейки в мою UITableViewController, когда editingDidBegin вызывается из UITextField в моей настраиваемой ячейке. В моем UITableViewController я изменяю размер UITableView, когда UITextField начал редактирование, и затем хочу, чтобы табличное представление прокрутилось до ячейки, в которой UITextField является первым респондентом. Но я не могу понять, как вернуть indexPath ячейки, где редактируется UITextField. Я пробовал так много способов, но все равно не работает. Один из способов заключается в следующем: в моем классе cstomCell я выбираю строку, используя [self setSelected:YES], а в моем контроллере телевизора, тогда, если я NSLog строка [self.tableV indexPathForSelectedRow], она всегда возвращает 0, хотя всегда не 0. 0. 1016 *

Ответы [ 4 ]

14 голосов
/ 09 сентября 2011

Просто дайте ячейке значение для ее свойства tag.Затем вы можете получить эту ячейку, вызвав эту

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

, затем, получив ячейку, вы можете получить NSIndexPath, подобный этому

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

Поскольку в вашей пользовательской ячейке есть UITextField, выможно поместить cell.textField.delegate = self; в метод источника данных

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

.Таким образом, вам не нужно будет устанавливать NSNotification в пользовательской ячейке.Также в этом же методе вы можете пометить как текстовое поле своих ячеек, например, cell.textField.tag = indexPath.row;, так и ячейку, подобную этой cell.tag = indexPath.row;

. Теперь, когда вы установили делегат UITextField, теперь вы можете поместить этот метод в UITableViewControllerclass

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

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

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

}

Приведенный выше метод делегата UITextField должен получить индекс indexPath для ячейки, которую вы в данный момент выбрали.

0 голосов
/ 09 августа 2012

Работает ли это (ваш ответ, который вы дали ранее ниже), если у вас есть несколько полей в каждой ячейке?:

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

Так как у вас есть UITextField в вашей пользовательской ячейке, вы можете поместить cell.textField.delegate = self; в

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

метод источника данных. Также в этом же методе вы можете пометить оба текстовых поля ваших ячеек, например, cell.textField.tag = indexPath.row; и такая ячейка как cell.tag = indexPath.row;

Теперь, когда вы установили делегат UITextField, теперь вы можете поместить этот метод в свой класс UITableViewController

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

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

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

У меня есть табличное представление с 8 ячейками, и в каждой ячейке у меня есть 6 текстовых полей, а также табличное представление является динамическим, поэтому пользователь может вставить больше ячеек ... но у меня возникают проблемы с сохранением текста. пользователь входит в каждое поле. Возможно ли, что с "cell.textField.tag = indexPath.row" контроллер идентифицирует текстовое поле, в котором я нахожусь?

0 голосов
/ 14 сентября 2011

попробуйте этот код ..

- (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 голосов
/ 10 сентября 2011

Мне нравится отмечать мои клетки так:

/* 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;
}

Другой способ - передать данные beginEditing с помощью пользовательского делегата и включить модель ячейки, которую затем можно использовать для определения пути в зависимости от того, как вы храните данные.

Посмотрите мой проект на github, в нем есть код для обработки этого случая, а также изменение размера клавиатуры и переход к следующей редактируемой ячейке: https://github.com/andrewzimmer906/XCell

...