Перезагрузите UITableView с другим количеством строк

#ios #objective-c #iphone #uitableview

#iOS #objective-c #iPhone #uitableview

Вопрос:

У меня настроен и работает UITableView, и теперь у меня небольшая проблема. Мне нужно перезагружать данные TableView всякий раз, когда загружается представление, и одна вещь, с которой я не могу начать работать, — это попытка перезагрузить данные, когда в табличном представлении изначально не было данных.

По сути, список имеет переменную длину, а содержимое загружается из файла, я хочу знать, есть ли способ принудительно перезагрузить таблицу и не позволять ей игнорировать методы источника данных, как это происходит всякий раз, когда вызывается [TableView reloadData].

Ответ №1:

[tableView reloadData] полностью полагается на методы источника данных! Итак, единственный способ, которым вы могли бы увидеть, что ваши методы источника данных игнорируются, заключается в том, что вы не установили источник данных (и, возможно, делегировали) вашего табличного представления в качестве объекта, который вы хотите использовать в качестве источника данных. Вы можете установить их через Interface Builder или программно, например:

 tableView.dataSource = self;
tableView.delegate = self;
  

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

1. Оба источника данных / делегата установлены, но у меня такое ощущение, что он перезагружает данные только для каждой ячейки, которая уже есть в таблице, в данном случае 0.

2. Этого не должно быть. Типичной реализацией для numberOfRowsInSection: является возврат количества объектов в массиве. Поэтому я должен верить, что к подобному методу источника данных часто обращаются. Вы могли бы установить точку останова в этом методе, чтобы проверить, вызывается ли он. Конечно, вам действительно нужно вызвать reloadData: . Я предполагаю, что вы, по крайней мере, делаете это, верно? 🙂

3. Правильно, я установил точку останова и обнаружил, что она вызывается каждый раз при загрузке представления, и дважды проверил, что я вызывал reloadData 🙂 И теперь это, похоже, работает. Должно быть, это было связано с другим представлением, записывающим в файл и испортившим его — ура разным ошибкам! Но, по крайней мере, мы знаем, что numberOfRowsInSection теперь вызывается каждый раз.

4. Неплохо. Мне нравится, когда странное поведение просто «уходит», но профессиональный разработчик программного обеспечения во мне всегда нервничает, не зная точно, что происходило в первую очередь … 🙂

5. Да, мне знакомо это чувство, но я не волнуюсь, я уверен, что оно вернется и настигнет меня однажды в ближайшее время…

Ответ №2:

всякий раз, когда загружается представление

Где вы вызываете reloadData? Вызываете ли вы это в -viewDidLoad методе? Если да, то это, вероятно, неверно, потому что -viewDidLoad вызывается только один раз — при создании представления соответствующего UIViewController (при первом использовании). Возможно, вам следует взглянуть на -viewWillAppear, который вызывается (при условии правильного использования UIViewController) всякий раз, когда будет отображаться view.

Другая возможная причина заключается в том, что если вы используете -viewWillAppear (или -viewDidAppear), он вообще не запускается. Это может произойти, если вы используете пользовательскую иерархию UIViewController. В этом случае вы должны вызвать его своими руками (есть исключения — UINavigationController, например, делает это за вас, но simple [someView addSubview:MyController.view] не делает).

Также, пожалуйста, проверьте, правильно ли установлены делегаты и значение TableView не равно нулю (как вы знаете, сообщения с нулевым значением просто игнорируются).

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

1. Да, используя -viewDidAppear, я проверил этот метод, и он вызывается каждый раз при загрузке представления (контроллер tableview в контроллере панели вкладок). И делегаты действительно настроены. Хотя спасибо за ответ!

Ответ №3:

методы источника данных не игнорируются при вызове [TableView reloadData]; Правильно ли вы настроили IBOUTLET и исходные файлы?