Пользовательский заголовок UITableView исчезает после предупреждения памяти - PullRequest
15 голосов
/ 31 декабря 2010

У меня есть UITableViewController. Я создаю собственный headerView для его 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 выше, я вижу, что он вызывается, когда я переключаюсь обратно на вкладку после предупреждения о памяти, и все же я не могу видеть заголовок.

Есть идеи о том, что мне здесь не хватает?

РЕДАКТИРОВАТЬ: Это происходит на устройстве и симуляторе. На устройстве я просто позволяю предупреждению памяти появиться, открыв кучу разных приложений, пока мое находится в фоновом режиме.

Ответы [ 9 ]

6 голосов
/ 08 января 2011

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

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

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

2 голосов
/ 28 сентября 2011

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

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

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

2 голосов
/ 31 декабря 2010

Сохраняйте containerView вместо того, чтобы выпускать его. И вернуть его в tableView: viewForHeaderInSection: (метод UITableViewDelegate).

0 голосов
/ 15 декабря 2012

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

- (void)viewDidLoad 
{
    [super viewDidLoad];

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

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

_tableHeaderView = nil

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

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

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

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

0 голосов
/ 14 января 2011

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

0 голосов
/ 09 января 2011

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

0 голосов
/ 08 января 2011

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

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

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

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

0 голосов
/ 08 января 2011

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

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