2012-01-23 2 views
4

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

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

//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?

EDIT 1:

Как я загрузить вид:

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

detailviewcontroller не имеет ViewController, просто UIViews, здесь hierarchie:

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

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

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

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

С IBAction я хочу итерацию строки CoreData, отобразить следующую строку в текущей, если действие called..and так далее ..

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

EDIT 2: решаемые
Я поставил код в новый метод и вызывать этот метод решить мою проблему.

+0

Почему вы это делаете? Что вы ожидаете от этого? Обычно вызов '-setNeedsDisplay' на каком-то другом элементе пользовательского интерфейса не будет * ничего *, потому что если элемент пользовательского интерфейса должен обновить свой экран (в ответ на изменение свойств), он уже сам вызовет этот метод. –

+0

Я меняю контент, а также цвет/изображение на этом IBAction. контент поступает из coreData. Мне нужно перерисовать uiviews, чтобы отобразить изменения в ibaction. – brush51

+1

setNeedsDisplay просто перерисовывает представление, он не сбрасывает его свойства (например, цвет). Для этого вам придется перезагрузить их из файла nib (см. Ответ ниже). –

ответ

17

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

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

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

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 ...] или эквивалент, то лучший способ перезагрузить вид просто выбросить и вызов этот метод снова.

+0

Благодарим за отзыв. См. Мой Edit1. Немного объяснили. – brush51

+0

Похоже, вы делаете что-то странное с контроллерами представлений, которые, вероятно, не работают так, как вы думаете. Вы говорите, что у вас нет контроллера вида, но что такое DetailViewController, если нет контроллера вида? Я знаю, что в файле nib нет контроллера представления, потому что это не то, как работают nibs, но вы все еще создаете контроллер представления и заполняете его иерархию представлений от наконечника. –

+0

Я поместил код в новый метод, и вызов этого метода решил мою проблему. Спасибо! – brush51

1

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

[self.pageViewController.view removeFromSuperview]; 
self.pageViewController.view = nil; // unloads the view 
[self performSegueWithIdentifier:@"pageViewSegue" sender:self]; 
6

Swift 2

Это точная копия ответа Ник Локвуда для некоторой легкой копии пасты

let parent = self.view.superview 
self.view.removeFromSuperview() 
self.view = nil 
parent?.addSubview(self.view)