перезагрузить / обновить подпредставления - setNeedsDisplay не работает - PullRequest
4 голосов
/ 24 января 2012

У меня проблемы с setNeedsDisplay. У меня есть UIView с множеством вложенных UIViews, созданных в Inteface Builder. У меня также есть кнопка с IBAction. В этом IBAction я хочу перерисовать / перезагрузить все UIViews (или все элементы UIE, такие как 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]];  

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

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

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

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

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

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

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

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

Ответы [ 3 ]

18 голосов
/ 24 января 2012

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

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

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

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

7 голосов
/ 12 февраля 2016

Свифт 2

Это точная копия ответа Ника Локвуда на простую копию

let parent = self.view.superview
self.view.removeFromSuperview()
self.view = nil
parent?.addSubview(self.view)
1 голос
/ 09 августа 2013

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

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