Пользовательский заголовок 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
.