iOS UITableView пропускает после didReceiveMemoryWarning - PullRequest
1 голос
/ 01 января 2012

Я немного растерялся и надеюсь, что кто-то может указать, где я ошибся.

Мое приложение - приложение Master / View, предназначенное для iPad.

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

Однако, как только я получаю предупреждение didReceiveMemory, представление self.tableView ведет себя странно. NumberOfSectionsInTableView и tableView: numberOfRowsInSection: методы никогда больше не вызываются, и когда мой код пытался выбрать первый элемент (после предупреждения о памяти), как это:

[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 
                animated:NO
                scrollPosition:UITableViewScrollPositionMiddle];

вылетает с

- [UITableView scrollToRowAtIndexPath: atScrollPosition: animated:]: строка (0) за пределами (0) для раздела (0). '

Так что же дает? Если память моего tableView полностью очищена во время предупреждения о памяти, почему он не был установлен в ноль? И как мне снова его собрать?

1 Ответ

1 голос
/ 01 января 2012

Реализуете ли вы просмотр таблицы для каждого строителя интерфейса или для кода? Когда вы используете self, я предполагаю, что вы используете свойство с retain. Убедитесь, что вы установили это значение в nil в вашем viewDidUnLoad и освободите указатель поля в вашем методе dealloc. Если нет, то проблема лежит где-то еще, но я предполагаю, что вы делаете это, потому что это хорошая практика.

Если вы построили табличное представление по коду и в свойстве viewDidUnload вы установили свойство nil, вы должны будете снова выделить его после получения предупреждения о памяти. Места для этого - viewDidLoad, initWith и т. Д. View with load - это, в основном, лучший вариант, так как он вызывается, как только вы возвращаетесь через Nav- или TabBarController.

Если вы используете конструктор интерфейса и ваше представление загружается в ваш AppDelegate (например, в методе didFinishLaunchingWithOptions), метод awakeFromNib никогда не будет вызываться снова, если вы не вызовете его снова. Так что НЕ устанавливайте переменные экземпляра равными nil в этом случае в вашем viewDidUnload. В противном случае вы потеряете указатель на табличное представление компоновщика интерфейса. Эта последняя часть может быть причиной, но на самом деле это не так, потому что IMO - не очень хорошая практика.

Если вы расскажете мне больше о своем коде, я могу помочь вам более конкретно.

Поздравления Markus

...