cellForRowAtIndexPath падает после вызова намного позже, чем numberOfRowsInSection - PullRequest
1 голос
/ 11 ноября 2010

Я сталкиваюсь с проблемой, когда вызывается tableView:numberOfRowsInSection:, затем вызываются другие методы, которые влияют на базовый массив, затем вызывается tableView:cellForRowAtIndexPath: и происходит сбой, потому что содержимое базового массива отличается от того, когда numberOfRowsInSection был назван.Если фреймворк вызовет numberOfRowsInSection прямо перед вызовом cellForRowAtIndexPath, проблем не будет.

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

Подробнее о том, как возникает эта проблема:

  1. Приложение использует контроллер панели вкладок.
  2. Корневым контроллером для каждой вкладки является UINavigationController.
  3. Указанный контроллер представления вызывается путем помещения его в стек навигации второго контроллера панели панели вкладок.
  4. Метод viewWillAppear рассматриваемого контроллера представления сбрасывает базовый массив и затем вызывает [_tableView reloadData].
  5. Делегат приложения, который реализует UITabBarControllerDelegate, реализует метод tabBarController:didSelectViewController: и вызывает popToRootViewControllerAnimated: на контроллере представления
  6. Метод viewWillAppear корневого контроллера представления вызывает метод в рассматриваемом контроллере представления, который влияет на содержаниеts базового массива.

Действия по воспроизведению проблемы:

  1. Запуск приложения.
  2. Коснитесь элемента второй вкладки.
  3. Нажмите, чтобы вызвать рассматриваемый контроллер представления.Выполните работу в этом представлении, чтобы заполнить таблицу.
  4. Коснитесь первого элемента вкладки.
  5. Коснитесь второго элемента.

На пятом шаге приведен порядокзвонки:

  1. viewControllerInQuestion: viewWillAppear - перезагружает базовый массив, вызывает [_tableView reloadData]
  2. viewControllerInQuestion: numberOfRowsInSection - возвращает 1
  3. делегат приложения: didSontrolOntlViewC1051 *
  4. secondTabBarRootViewController: viewWillAppear - вызывает метод для viewControllerInQuestion, который очищает содержимое базового массива
  5. viewControllerInQuestion: cellForRowAtIndexPath - сбой при попытке доступа к объекту с индексом 0 в базовом массиве. * 10 *

    1057 *Спасибо за любую помощь, вы можете дать мне.

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Это оказалось проблемой с неправильными вызовами reloadData в табличном представлении.Я унаследовал этот код, но я достаточно новый для iOS, чтобы не понимать правильное использование.

Код вызывал [_tableView reloadData] как в loadView, так и в viewWillAppear.Удаление обоих вызовов решило эту конкретную проблему.

0 голосов
/ 17 февраля 2011

У меня была похожая проблема.Если в контроллере есть наблюдатель, который вызывает reloadData, используйте метод viewWillAppear, чтобы добавить наблюдателя, и viewWillDisappear, чтобы удалить его.

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