Мне нужно получить NSIndexPath
для пользовательской ячейки в UITableView
. Вот проблема: я отправляю NSNotification
из своей пользовательской ячейки в свою UITableViewController
, когда editingDidBegin
вызывается из UITextField
в моей пользовательской ячейке. В моем UITableViewController
я изменяю размер UITableView
, когда UITextField
начинает редактировать, а затем хочу, чтобы табличное представление прокручивалось до ячейки, в которой UITextField
отвечает первым. Но я не могу понять, как вернуть indexPath
ячейки, где редактируется UITextField
. Я пробовал так много способов, но это все еще не работает. Один из способов таков: в моем классе cstomCell я выбираю строку, используя [self setSelected:YES]
, а в моем ТВ-контроллере, если я NSLog
выбираю строку [self.tableV indexPathForSelectedRow]
, она всегда возвращает 0, даже если она всегда не 0.
Вернуть NSIndexPath из пользовательской ячейки? (UITableView)
- не могли бы вы просто получить его
frame
? 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, вы можете поместить этот метод в свой класс UITableViewController.
- (void)textFieldDidBeginEditing:(UITextField *)textField {
CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
}
Приведенный выше метод делегата UITextField должен предоставить вам indexPath для ячейки, которую вы выбрали в данный момент.
попробуй этот код..
- (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;
}
Это (ваш ответ, который вы дали ранее ниже) все еще работает, если у вас есть несколько текстовых полей в каждой ячейке?:
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» контроллер идентифицирует текстовое поле, в котором я нахожусь?
Мне нравится помечать свои ячейки так:
/* 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