three20 - Предупреждение о памяти TTTableViewController дает пустой экран, как исправить?

Это сводит меня с ума. Я использую TTTableViewController от three20, и когда я получаю предупреждение о памяти, экран становится белым. Теперь, после прочтения группы Google three20, кажется, что 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

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


person Nic Hubbard    schedule 16.03.2011    source источник


Ответы (3)


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

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

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

person Sean S Lee    schedule 16.03.2011
comment
Нет, я не подклассифицирую его. В моем методе viewDidUnload у меня ничего нет, поэтому где-то через три 20 он освобождается. - person Nic Hubbard; 17.03.2011
comment
Можете ли вы поделиться кодом метода, который добавляет tttbc в ваше представление? - person Sean S Lee; 17.03.2011

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

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

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

person aporat    schedule 20.06.2011

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

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

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

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

person edsko    schedule 05.09.2011