重新加载/刷新子视图 – setNeedsDisplay不工作

我有麻烦setNeedsDisplay。 我有一个UIView有很多子UIViews,在Inteface Builder中创build。 我也有一个IBActionbutton。 在这个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和子视图?

编辑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:已解决
我已经把代码放在一个新的方法中,调用这个方法已经解决了我的问题。

你是否试图将你的视图和子视图重置为它们在nib文件中的默认状态?

如果是的话,上面的方法将无法工作。 唯一能够自动执行的方法是从笔尖重新加载视图,但是在我能提供帮助之前,您需要先清楚如何加载视图。

如果你将它加载到视图控制器中,那么刷新它的最简单的方法是从屏幕上删除视图控制器并重新创build它,但是你也许可以重新加载视图(在控制器内):

 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加载视图,那么重新加载视图的最好方法就是把它扔掉,再次调用该方法。

Swift 2

这是尼克·洛克伍德对于一些简单的复制粘贴的复制

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

这可以帮助某人,在容器视图内进行分页。 上面的代码给了我想法试试这个,它的工作原理。

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