Как получить индекс UITableViewCell из его отредактированного UITextField - PullRequest
6 голосов
/ 20 апреля 2011

Я работаю над бизнес-проектом на базе iPhone.

У меня есть UITextField в UITextViewCell, UITextFieldDelegate указывает на мой UITableViewController, я не делала подклассов для UITextViewCell и UITextField.

Теперь, после окончания редактирования текстового поля делегата

  -(void)textFieldDidEndEditing:(UITextField*)textField

Мне нужно знать индекс строки текущей ячейки, которую я редактирую, есть ли способ получить родительскую ячейкутекстового поля?Или я могу установить какое-либо свойство для текстового поля, например 'rowIndex', когда я создаю ячейку?Мне действительно нужно это значение, чтобы сохранить новый текст.

Спасибо.Да пребудет с тобой Сила.

Ответы [ 8 ]

9 голосов
/ 24 сентября 2013

С изменениями в классе UITableViewCell в iOS 7 у вас должен быть более динамичный способ добраться до родительской ячейки.Вы можете попасть в ячейку UITextField, используя следующий фрагмент (который вы должны указать в методе делегата textFieldDidEndEditing:)

// Get the cell in which the textfield is embedded
id textFieldSuper = textField;
while (![textFieldSuper isKindOfClass:[UITableViewCell class]]) {
    textFieldSuper = [textFieldSuper superview];
}
// Get that cell's index path
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)textFieldSuper];

Фрагмент работает как в iOS 6, так и в iOS 7.

8 голосов
/ 20 апреля 2011

Реальный вопрос, который вы задаете, заключается в том, как узнать, где сохранять изменения в вашей модели данных, когда пользователь вводит данные в текстовое поле в ячейке таблицы.

@ Предложение Оле Бегеманна использовать tag свойство является совершенно действительным.Это зависит от вашей модели данных.Если все, что вам нужно, это одно целое число, чтобы определить, где значение попадает в вашу модель, сохраните это целое число в свойстве tag каждого текстового поля.Поскольку вы не используете разделы, индекс строки эквивалентен полному пути индекса.

Помните, что все представления имеют свойство tag.Таким образом, вы можете сохранить индекс строки в cell.contentView.tag и индекс столбца в textField.tag.Из текстового поля вы получите вид содержимого с textField.superview.Если другое представление является суперпредставлением textField, используйте его вместо этого.

Если вам нужно что-то более сложное, чтобы определить местоположение в вашей модели для сохранения содержимого текстового поля, тогда вам нужно будет что-то сделатьразные.Я бы либо создал подкласс UITableViewCell, либо UITextField и сохранил бы любую необходимую вам информацию в свойстве, которое вы определяете в подклассе.

4 голосов
/ 20 апреля 2011

Если вы добавили UITextField в UITableViewCell в качестве подпредставлений, Таким образом, вы можете получить доступ к UITableViewCell из вашего UITextField's superview свойства.

Попробуйте с ниже.

UITableViewCell* myCell = (UITableViewCell*)textField.superview ;

Дайте мне знать по любой проблеме, с которой вы столкнулись.

Отредактировано:

вы получите строку из свойства tag вашего UITextField So

NSUInteger  myRow = myTextField.tag;

Поскольку вы сказали, что ваше приложение не поддерживает несколько разделов, это означает, что у вас все строки в разделе 0.

NSUInteger  mySection = 0;

Теперь создайте NSIndexPath экземпляр из приведенной выше информации.

NSIndexPath *myIndexPath =[NSIndexPath indexPathForRow:myRow  inSection:mySection]; //Do'nt release myIndexPath instance.

UITableViewCell* myCell = [myTableView cellForRowAtIndexPath:myIndexPath];

Теперь у вас есть myCell, который находится на myRow в вашем UITableView

3 голосов
/ 23 октября 2013

Для iOS 7 все немного по-другому. Если aTextField является объектом вида: UITextField iOS 6: [[aTextField superView] superView]

iOS 7: [[[aTextField superView] superView] superView]

Apple добавила ScrollView между UItableViewCell и его contentView.

Редактировать: представление прокрутки исчезло в iOS 8.

iOS 8: [[aTextField superView] superView]

2 голосов
/ 20 апреля 2011

Как и предполагали другие, вы можете получить текущую ячейку, обратившись к суперпредставлению текстового поля.Оттуда вы можете легко найти путь индекса текущей ячейки, используя метод UITableView -indexPathForCell: .

Обновление

ПокаЯ до сих пор считаю, что вышеизложенное - самый простой и лучший способ сделать это, возможно, это может вызвать замедление в большом табличном представлении (если -indexPathForCell: включает линейный поиск).Я просто прочитал еще одну интересную идею: представить раздел и строку в виде шорт без знака, упаковать их в одно целое число и сохранить результат в свойстве тега представления (текстового поля) ( source ).

1 голос
/ 20 апреля 2011

Вы можете установить textfield.tag на индекс строки при возврате ячейки в tableView:cellForRowAtIndexPath:.

0 голосов
/ 10 марта 2014

На самом деле нет необходимости беспокоиться о том, какой индекс ячеек в настоящее время подлежит редактированию. Я использую этот код

UIView *tableViewCellView = [[field superview] superview];
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
     // Need to traverse one step more up the visual tree
     tableViewCellView = [tableViewCellView superview];
}
[self.tableView scrollRectToVisible:[tableViewCellView frame] animated:YES];

в сочетании с методом делегата BSKeyboardControls для успешной прокрутки выбранного поля в поле зрения. Протестировано с ios5 и выше

0 голосов
/ 03 октября 2012

Имейте в виду, что если у вас длинная таблица ячеек, они могут быть освобождены из-за размера фрейма UITableView.

Поскольку iOS повторно использует ячейку, если у вас есть несколько похожих ячеек, попробуйте сделатьэто: начните редактировать ячейку, нажав на UITextField, прокрутите вниз до другой ячейки, пока выбранный UITextField не будет вне поля зрения, и теперь посмотрите, что происходит в методе -(void)textFieldDidEndEditing:(UITextField*)textField.Вы заметите, что textFiled.superview - это указатель NULL, поскольку ячейка была освобождена, и вы больше не можете к ней обращаться.

Единственное решение, которое приходит мне в голову, - хранить нужные атрибуты ячейки в свойстве черезметод -(void)textFieldDidBeginEditing:(UITextField*)textField.

...