5

我遇到了 setNeedsDisplay 的问题。我有一个带有很多子 UIView 的 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,这里是层次结构:

  • UIView
    ——UIViewContainer
    ——UIView0
    ——UIView1
    ——UIViewStapel

我期望做什么:

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

我的详细视图中有很多子视图(uiviews),请参见上面的层次结构。我在 UIViews 中显示内容,内容来自 coreData。
view1 包含 coreData 的当前行。
view0 包含上一行 coreData。
viewStapel 包含下一行 coreData。

使用 IBAction 我想迭代 coreData 行,如果调用该操作,则在当前显示下一行..等等..

在 Log 中,数据会发生变化,但不会显示在 UIViews 中。原因是我需要重绘或重新加载或类似的东西,以显示当前数据。

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

4

3 回答 3

19

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

于 2012-01-23T22:45:47.253 回答
8

斯威夫特 2

这是尼克洛克伍德的一些简单复制粘贴答案的副本

let parent = self.view.superview
self.view.removeFromSuperview()
self.view = nil
parent?.addSubview(self.view)
于 2016-02-12T05:59:07.830 回答
1

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

[self.pageViewController.view removeFromSuperview];
self.pageViewController.view = nil; // unloads the view
[self performSegueWithIdentifier:@"pageViewSegue" sender:self];
于 2013-08-09T13:34:26.663 回答