перезагрузить/обновить subViews - setNeedsDisplay не работает

у меня проблемы с setNeedsDisplay. У меня есть UIView с множеством дополнительных UIView, созданных в Inteface Builder. У меня также есть кнопка с IBAction. В этом IBAction я хочу перерисовать/перезагрузить все UIViews (или все UIElement, такие как UILabel, UIWebView и т. д.)

Я делаю это, что у меня не работает, не знаю почему.. :

//redraw the UIViews
[self.view_card_0 setNeedsDisplay];
[self.view_card_1 setNeedsDisplay];
[self.view_card_stapel setNeedsDisplay];

//other UI Elements
[self.webView_0 setNeedsDisplay];
[self.webView_1 setNeedsDisplay];
[self.webView_stapel setNeedsDisplay];

[self.lblCardTitle_0 setNeedsDisplay];
[self.lblCardTitle_1 setNeedsDisplay];
[self.lblCardTitle_stapel setNeedsDisplay]; 

[self.img_card_0 setNeedsDisplay];
[self.img_card_1 setNeedsDisplay];
[self.img_card_stapel setNeedsDisplay];

Что делать для перерисовки/перезагрузки/обновления всех UIElements/UIViews и Subviews?

ИЗМЕНИТЬ 1:

Как загрузить представление:

detailViewController = [[DetailViewController alloc]  
initWithNibName:@"DetailViewController_iPad" bundle:[NSBundle mainBundle]];  

Контроллер просмотра деталей не имеет контроллера просмотра, только UIViews, здесь иерархия:

  • UIView
    -- UIViewContainer
    --- UIView0
    --- UIView1
    --- UIViewStapel

Что я собираюсь сделать:

*Я не хочу сбрасывать UIView, я хочу изменить фон и их содержимое. *

В моем подробном представлении много подвидов (uiviews), см. выше иерархию. Я показываю содержимое в UIViews, содержимое поступает из coreData.
Представление1 содержит текущую строку coreData.
Представление0 содержит предыдущую строку coreData.
ViewStapel содержит следующую строку coreData.

С помощью IBAction я хочу перебирать строки coreData, отображать следующую строку в текущей, если действие вызывается... и т.д..

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

РЕДАКТИРОВАНИЕ 2: РЕШЕНО
Я поместил код в новый метод, и вызов этого метода решил мою проблему.


person brush51    schedule 23.01.2012    source источник
comment
Почему вы это делаете? Что вы ожидаете от него? Обычно вызов -setNeedsDisplay для какого-либо другого элемента пользовательского интерфейса ничего не дает, потому что, если элемент пользовательского интерфейса должен обновить свое отображение (в ответ на изменение свойств), он уже вызвал этот метод для самого себя.   -  person Lily Ballard    schedule 24.01.2012
comment
я меняю содержимое, а также цвет/изображение на этом IBAction. содержимое поступает из coreData. мне нужно перерисовать uiviews, чтобы отобразить изменения на ibaction.   -  person brush51    schedule 24.01.2012
comment
setNeedsDisplay просто перерисовывает представление, а не сбрасывает его свойства (например, цвет). Для этого вам придется перезагрузить их из nib-файла (см. ответ ниже).   -  person Nick Lockwood    schedule 24.01.2012


Ответы (3)


Вы пытаетесь сбросить свое представление и подпредставления в их состояние по умолчанию в файле пера?

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

Если вы загружаете его в контроллер представления, то самый простой способ обновить его — удалить контроллер представления с экрана и заново создать его, но вы можете перезагрузить представление, говоря что-то вроде этого (изнутри контроллера):

UIView *parent = self.view.superview;
[self.view removeFromSuperview];
self.view = nil; // unloads the view
[parent addSubview:self.view]; //reloads the view from the nib

Если вы загружаете представление непосредственно из пера с помощью [[NSBundle mainBundle] loadNibNamed...] или эквивалентного, лучший способ перезагрузить представление — просто выбросить его и снова вызвать этот метод.

person Nick Lockwood    schedule 23.01.2012
comment
Спасибо за ответ. Смотрите мой Edit1. Немного объяснили. - person brush51; 24.01.2012
comment
Похоже, вы делаете что-то странное с контроллерами представления, что, вероятно, не работает так, как вы думаете. Вы говорите, что у вас нет контроллера представления, но что такое DetailViewController, если не контроллер представления? Я знаю, что в файле пера нет контроллера представления, потому что это не то, как работают пера, но вы все еще создаете контроллер представления и заполняете его иерархию представлений из пера. - person Nick Lockwood; 24.01.2012
comment
Я поместил код в новый метод, и вызов этого метода решил мою проблему. Спасибо! - person brush51; 25.01.2012

Свифт 2

Это копия ответа Ника Локвуда для легкой копии.

let parent = self.view.superview
self.view.removeFromSuperview()
self.view = nil
parent?.addSubview(self.view)
person smoosh911    schedule 12.02.2016

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

[self.pageViewController.view removeFromSuperview];
self.pageViewController.view = nil; // unloads the view
[self performSegueWithIdentifier:@"pageViewSegue" sender:self];
person DogCoffee    schedule 09.08.2013