重新加载/刷新子视图 - setNeedsDisplay不起作用

时间:2012-01-23 22:31:59

标签: ios uiview subview redraw setneedsdisplay

我遇到setNeedsDisplay问题。我有一个带有很多子UIViews的UIView,在Inteface Builder中创建。我还有一个带有IBAction的按钮。在这个IBAction中,我想重新绘制/重新加载所有UIViews(或所有UIElements,如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]];  

detailviewcontroller没有viewcontroller,只是uiviews,这里是hierarchie:

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

我期望做什么:

* 我不想重置UIView,我想改变它们的背景和内容。 *

我在detailview中有很多子视图(uiviews),见上面的hierarchie。我在UIViews中显示内容,内容来自coreData view1包含coreData的当前行 view0包含coreData的前一行 viewStapel包含coreData的下一行。

使用IBAction我想迭代coreData行,如果调用动作,则显示当前的下一行......等等。

在日志中,数据已更改,但未在UIViews中显示。因此我需要重绘或重新加载或类似的东西,以显示当前数据。

编辑2:已解决
我已将代码放入新方法中,并且调用此方法已解决了我的问题。

3 个答案:

答案 0 :(得分:18)

您是否尝试将视图和子视图重置为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 ...]或等效的方式直接从nib加载视图,那么重新加载视图的最佳方法就是将其丢弃并再次调用该方法。

答案 1 :(得分:7)

Swift 2

这是Nick Lockwood对一些简单复制粘贴的答案的复制品

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

答案 2 :(得分:1)

这可能会帮助某人在容器视图中进行分页。上面的代码给了我尝试这个的想法并且它有效。

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