J W*_*J W 1 iphone uiviewcontroller uiview
我今天遇到了一些奇怪的事情,也许有人知道一些事情.我有一个UIViewController的子类及其相关的NIB.我在UIViewController方法中设置标签,一切正常.
现在从另一个类,我再次创建ViewController,因为我想重用它.我这样做:
MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
vc.titleLabel.text = @"testing";
vc.myTextLabel.text = @"yo";
self.navigationController pushViewController:vc animated:NO];
[vc release];
Run Code Online (Sandbox Code Playgroud)
但这不工作.我不知道为什么这不起作用.我想我会设置所有标签,然后通过将视图控制器推入堆栈来显示它.
但是,如果我这样做:
[vc.view setNeedsDisplay]; // why here???
MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
vc.titleLabel.text = @"testing";
vc.myTextLabel.text = @"yo";
self.navigationController pushViewController:vc animated:NO];
[vc release];
Run Code Online (Sandbox Code Playgroud)
这DOES工作.这对我来说没有意义.我认为在需要重绘视图后调用setNeeds Display.如果我将setNeedsDisplay移动到块的末尾它不起作用.它只适用于块的开头,这对我来说非常奇怪.任何人之前遇到过这种情况或者知道它为什么会这样运作?谢谢.
原因是视图控制器的视图是延迟加载的.这意味着-loadView
当您view
第一次访问该属性时,控制器的视图仅从笔尖(或通过)加载.如果您在加载视图之前尝试访问标签,它们将为零,并且您发送给它们的任何消息都将是no-ops.
因此,要强制加载视图,您可以执行以下操作:
/* make sure the view is loaded */
[vc view];
/* Access the label properties */
vc.titleLabel.text = @"testing";
Run Code Online (Sandbox Code Playgroud)
但是,强制视图加载在所有情况下都不是一个好主意,特别是如果视图控制器不会立即显示并且您想要节省内存.
在这种情况下,您可以在控制器的init
方法中创建标签,使它们始终存在,并将它们手动添加到视图控制器的视图中-viewDidLoad
,而不是在您的笔尖中.这将允许标准的延迟加载行为起作用,但是在加载视图之前,类的用户仍然可以在标签上设置属性.
另一种方法是NSString
在视图控制器上公开具有关联ivars的简单属性,以表示视图中的任何标题或文本.然后在您-viewDidLoad
的文章中,您可以将标签的文本设置为这些属性的值.然后,视图控制器的用户可以在加载视图之前设置这些属性.
归档时间: |
|
查看次数: |
1028 次 |
最近记录: |