Подключение ячеек UITableView обратно к источнику данных

#iphone #objective-c #uitableview

#iPhone #objective-c #uitableview

Вопрос:

У меня есть бумажная форма с несколькими различными разделами, в каждом разделе содержится несколько разных вопросов. Я отображаю это как UITableView. Каждый вопрос отображается в виде UITableViewCell с самим вопросом и UITextField для ответа. В настоящее время UITableView поддерживается двумя типами объектов: Section и Question, причем каждый объект Section содержит массив вопросов.

Мне интересно, как я могу легко связать любое редактирование, которое происходит в UITableView, с объектами. Например, если пользователь вводит ответ на вопрос 1, я хотел бы затем иметь возможность присвоить текст этого ответа соответствующему объекту вопроса.

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

Мне это кажется уродливым, и я не слишком уверен, что произойдет, если UITableViewCell уйдет за пределы экрана и будет повторно использован в другом месте таблицы. Есть ли лучший способ, которого мне не хватает?

Ответ №1:

Если я не неправильно понимаю вопрос, почему бы просто не использовать протокол UITextFieldDelegate, чтобы сообщить объекту, что текстовое поле завершило редактирование.

Вы бы просто сделали следующее: Сделайте свой вопрос UITextFieldDelegate . Затем определите textFieldDidEndEditing в классе реализации вашего вопроса

 - (void)textFieldDidEndEditing:(UITextField *)textField {
    mAnswer = textField.text;
}
  

Это должно сделать все правильно? По завершении работы с текстовым полем объект Question получает ответ.

Комментарии:

1. Да, это был очевидный ответ, которого мне не хватало. Спасибо!

Ответ №2:

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

 UITextField *someTextField;
UIView *contentView = [someTextField superView];
UITableViewCell *cell = (UITableViewCell *)[contentView superView];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
  

Ответ №3:

Подобно тому, что сказал Родерик, у меня возникло бы искушение либо:

Передайте объект в tableviewcell (установите эту tableviewcell в качестве делегата текстового поля) и присвоите значение, введенное непосредственно объекту в

 - (void)textFieldDidEndEditing:(UITextField *)textField
  

Или присвоите каждой ячейке уникальный идентификатор, относящийся к объекту, тем же методом

  - (void)textFieldDidEndEditing:(UITextField *)textField
  

отправьте уведомление с введенным значением и уникальным идентификатором. Которые вы затем перехватываете и извлекаете значение, которое будет присвоено объекту.

Комментарии:

1. Если вы присвоите каждой ячейке уникальный идентификатор, вы потеряете эффективность очереди повторного использования, верно?

2. @Roderic в этом случае все равно следует сохранить функциональность очереди повторного использования. Мои мысли были о том, что вы могли бы использовать свойство tag и установить его в качестве индекса структуры данных, где структура данных является одноуровневой, или создать свойство для пользовательской ячейки для хранения более подробного идентификатора. Затем этот идентификатор будет обновлен, чтобы отразить отображаемую ячейку для поддержания эффективности очереди повторного использования и не связывать отдельную ячейку с объектом данных on.

3. Да, я полагаю, вы все равно сохранили бы эффективность повторного использования, но вы потеряли бы точность тегов. После повторного использования ячейки тег будет ссылаться на другую точку. Если я не неправильно понимаю решение.