【发布时间】:2012-01-23 22:31:58
【问题描述】:
我在使用 setNeedsDisplay 时遇到了问题。我有一个带有很多子 UIView 的 UIView,它们是在 Inteface Builder 中创建的。我还有一个带有 IBAction 的按钮。在这个 IBAction 中,我想重绘/重新加载所有 UIView(或所有 UIElement,如 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:已解决
我已将代码放入新方法中,调用此方法解决了我的问题。
【问题讨论】:
-
你为什么要这样做?你期待它做什么?通常在其他一些 UI 元素上调用
-setNeedsDisplay不会做任何事情,因为如果 UI 元素需要更新其显示(以响应更改的属性),它本身已经调用了该方法. -
我正在更改该 IBAction 的内容以及颜色/图像。内容来自coreData。我需要重新绘制 uiview 以显示 ibaction 上的更改。
-
setNeedsDisplay 只是重绘视图,它不会重置它的属性(例如颜色)。为此,您必须从 nib 文件中重新加载它们(请参阅下面的答案)。
标签: ios uiview subview redraw setneedsdisplay