three20 - Предупреждение памяти TTTableViewController дает пустой экран, как исправить - PullRequest
3 голосов
/ 17 марта 2011

Это сводит меня с ума. Я использую TT20TableViewController от Three20, и когда я получаю предупреждение о памяти, экран становится белым. Теперь, после прочтения на группе из трех Google, кажется, что TableView был выпущен. Но я на всю жизнь не могу найти чек, чтобы проверить, так ли это, а затем создать его снова.

Я использовал следующее, потому что думал, что это решит проблему, но кажется, что оно не удовлетворяет условию if:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    // If we don't have a datasource we need to reset it
    if (!self.dataSource) {
        // Create datasource again
    }

}//end

Кто-нибудь знает, что делать, когда это происходит? Группа Google не помогла.

Ответы [ 3 ]

0 голосов
/ 20 июня 2011

У меня была такая же проблема, и это также сводило меня с ума.

Никто не упоминает об этом в трех20 документах, но вы не должны использовать функцию initWithNibName UIViewController для добавления подпредставлений. Если вы это сделаете, предупреждение памяти освободит эти подпредставления.

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

0 голосов
/ 05 сентября 2011

В общем, вы должны быть осторожны при настройке представлений в viewDidLoad, а не в конструкторе классов. Например, вы должны настроить представление панели запуска в viewDidLoad, а не в конструкторе контроллера представления панели запуска, иначе ваш модуль запуска станет пустым после предупреждения о памяти.

В случае TTTableViewController, однако, это (обычно) не применяется, потому что вы не настраиваете табличное представление вручную. У меня была та же проблема, что и у вас, и в конце концов я ее разыскал: я переопределил viewWillDisappear: и забыл позвонить [super viewWillDisappear:animated]. Это означало, что некоторые из флагов, которые контроллер Three20 поддерживает относительно состояния представления, не были обновлены правильно.

Я также обнаружил, что было бы полезно переопределить didReceiveMemoryWarning для вызова [self setEditing:NO] перед вызовом super; Я обнаружил, что в противном случае состояние табличного представления запуталось (это не имеет значения, если вы не используете режим редактирования для своей таблицы).

Наконец, в Three20 есть ошибка, которая означает, что таблицы в режиме загрузки / очистки / ошибки не будут восстановлены должным образом; см. обсуждение в сообщении в блоге TwoCentStudios и предлагаемое исправление для github .

0 голосов
/ 17 марта 2011

Вы подклассифицируете TTTableViewController?Я не использовал его раньше, но при условии, что он похож на UITableViewController ...

Как выглядит ваш viewDidUnload?Вы выпускаете табличное представление здесь?Если это так, вам нужно создать табличное представление в viewDidLoad, чтобы соответствовать ему.

Нет необходимости проверять, доступен ли dataSource в viewDidAppear, потому что, если вы читаете руководство по программированию View, это объясняет, что предупреждение памяти вызовет "viewDidUnload"дать вам возможность очистить данные, созданные в "viewDidLoad".

...