Пользовательский заголовок UITableView исчезает после предупреждения о памяти

У меня есть UITableViewController. Я создаю для него свой собственный заголовочный файл tableView в методе loadView, например:

(void)loadView {
    [super loadView];

    UIView* containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height * 2 )];  
    containerView.tag = 'cont';
    containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;

    UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(padding, height, width, height);
    ... //configure UIButton and events

    UIImageView* imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"] highlightedImage:[UIImage imageNamed:@"highlight.png"]];    
    imageView.frame = CGRectMake(0, 0, width, height );
    ... //configure UIImageView

    [containerView addSubview:button];
    [containerView addSubview:imageView];
    self.tableView.tableHeaderView = containerView;

    [imageView release];
    [containerView release];
}

Ни один из других методов (viewDidLoad/Unload и т.д.) не перегружен.

Этот контроллер размещен на вкладке. Когда я переключаюсь на другую вкладку и имитирую предупреждение о памяти, а затем возвращаюсь к этой вкладке, мой UITableView отсутствует мой заголовок custon. Все строки/секции видны, как я ожидал. Полагая BP в коде loadView выше, я вижу, что он вызывается, когда я переключаюсь обратно на вкладку после предупреждения о памяти, и все же я не могу видеть заголовок.

Любые идеи о том, что мне здесь не хватает?

EDIT: Это происходит на устройстве и симуляторе. На устройстве я просто предупреждаю о памяти, открыв кучу разных приложений, а мой - в фоновом режиме.

Ответы

Ответ 1

метод loadView не должен вызывать супер. Попробуйте удалить [super loadView]; и это может решить вашу проблему. Другие переопределенные методы просмотра (viewDidLoad, viewWillAppear и т.д.) Могут вызвать супер просто отлично. См. Документацию по адресу:

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

для подтверждения.

Ответ 2

Храните keepView вместо его отпускания. И верните его в tableView: viewForHeaderInSection: (метод UITableViewDelegate).

Ответ 3

У меня была схожая проблема, хотя, похоже, она не объясняет ситуацию с ОП, основанной на его коде; Я просто хочу поставить его здесь, если кто-то еще столкнется с этим.

Я сохраняю свой заголовок в переменной экземпляра. В моем представленииDidLoad я проверяю, равна ли эта переменная nil, если это тогда, я создаю представление, сохраняю и устанавливаю для него переменную экземпляра и устанавливаю для нее tableHeaderView. Проблема в том, что это условие будет истинным только один раз, потому что моя переменная экземпляра никогда не будет равна nil после первого его создания; однако в представлении таблицы tableHeaderView будет установлено значение nil, когда появляется предупреждение о памяти, поэтому больше не будет представления заголовка, хотя у меня все еще есть представление в переменной экземпляра.

Решение заключалось либо в том, чтобы изменить проверку, чтобы увидеть, является ли свойство table tableHeaderView значением nil (а затем повторно воссоздать заголовок каждый раз, когда оно установлено на nil), или (поскольку в этом случае у меня все еще есть представление, сохраненное в переменной экземпляра), чтобы переместить присвоение в tableHeaderView за пределами if-блока, таким образом, каждый раз, когда выполняется viewDidLoad, мы обязательно переустановим представление заголовка на tableHeaderView, если оно получил нулевое значение.

Ответ 4

Какова ширина и высота? Возможно ли, что после предупреждения о памяти они равны нулю?

Ответ 5

что является обычным способом, iOS использует этот способ для уменьшения объема памяти, в то время как проблема с памятью памяти, тогда он освободит некоторый элемент пользовательского интерфейса, который также вызовет метод "didUnLoad"... вам нужно освободить headerView в методе ' didUnLoad ', установлен на нуль, а затем в методе' didLoad 'для создания headerView, если он равен нулю, а затем добавить его в tableView.  iOS автоматически освободит некоторые элементы пользовательского интерфейса при предупреждении памяти лица.

Ответ 6

Я просто столкнулся с аналогичной проблемой, из-за которой мой пользовательский заголовок для uitableview не перезагружается после получения предупреждения о памяти. моя текущая реализация для создания заголовка

- (void)viewDidLoad 
{
    [super viewDidLoad];

    if (_tableHeaderView == nil)
    {
        [[NSBundle mainBundle] loadNibNamed:@"DetailHeaderView" owner:self options:nil];
        self.tableView.tableHeaderView = _tableHeaderView;
    }
}

и чтобы исправить проблему, я просто добавил эту строку в свой makeReceiveMemoryWarning

_tableHeaderView = nil

и теперь он перезагружается после отправки предупреждения о памяти.
Извините, если на это уже был дан ответ, но я не нашел четкого ответа на мою проблему, и решил, что я поплю это здесь для кого-то еще в моей ситуации.

Счастливое кодирование

Ответ 7

Эта проблема известна. Например, если вы используете TableViewDelegate tableView:viewForHeaderInSection: он тоже не будет работать.

Проблема в iOS, а не в тебе. У tableHeaderView не так много вопросов, потому что никто не использует его, и поэтому Apple не получила никаких записей BugTracker...

Посмотрите на старый вопрос: здесь. А вот и другие проблемы.

Так что я думаю, что это ошибка SDK...

Ответ 8

Выполнение reloadData в представлении таблицы может помочь

Ответ 9

Единственная проблема, которую я вижу, глядя только на ваш loadView, заключается в том, что вы пытаетесь пометить свой containerView строкой. Насколько мне известно, это должно быть NSInteger.