UIView 在加载 NIB 文件后立即显示?
Posted
技术标签:
【中文标题】UIView 在加载 NIB 文件后立即显示?【英文标题】:UIView shows immedialtelly after loading NIB-file? 【发布时间】:2012-05-29 15:54:16 【问题描述】:我尝试将 UIView 添加到我的应用程序。它确实有效,但不如预期。我已经在我的标题中定义了 socialActionView 并在我的视图控制器中创建了一个 @synthesize。
当用户点击一个按钮时加载 nib 文件。我想我必须调用 addSubview 方法来显示视图。但即使我不这样做也会出现。
如果我调用 addSubView 方法,当我加载视图并显示消息“警告:无法恢复先前选择的帧”时,应用程序崩溃。
谁能解释这里发生了什么?我不明白。
- (IBAction)didTapOkSocialAction:(id)sender;
self.socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];
//[self.view addSubview:socialActionView];
编辑
在这种情况下,解决方案是将我的 SocialActionViewController.xib 的文件所有者设置为 ViewController.h。我还不知道如何从附加到另一个视图控制器类的 NIB 中添加 UIView,而不是加载视图的视图控制器。
【问题讨论】:
【参考方案1】:您的socialActionView
已经绑定到其父视图中的视图占位符。
所以:它已经存在(它的引用已作为子视图添加)但在您实际加载它之前它是nil
。
编辑:目前尚不清楚您是如何将所有东西连接到那里的,但根据您在下面添加的信息,我会大胆猜测。
试试这个代码:
- (IBAction)didTapOkSocialAction:(id)sender;
UIView *loadedView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];
[self.view addSubview:loadedView];
编辑:因为您想以编程方式从 .xib 加载视图控制器,您可以这样做(可能视图控制器在 MyViewController.h、.m、.xib 中定义):
MyViewController *myViewController; //as an ivar or a property in @interface
myViewController = [[ViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
然后你可以添加它的视图:
[self.view addSubview: myViewController.view];
【讨论】:
啊,我明白了。我假设已经是这样了。但即使我将其更改为: UIView *socialActionView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];它仍然立即显示 UIView。这是通常的行为吗?我只是想知道如果不再需要 addSubView 有什么用? @rockstarberlin:您最好立即加载它,并将hidden
属性设置为YES
,并在用户点击按钮时取消隐藏它。但这取决于你的应用程序的结构和层次结构,所以我真的不能说。
@rockstarberlin:当然 addSubview 仍然需要,只是在其他情况下。至于你的第二个测试:这很奇怪——编译器至少应该发出警告——如果你有同名的属性和局部变量。
嗯,是的,也许你是对的。我认为在需要之前不要加载东西是更好的做法。谢谢你的回答。
在这种情况下,您必须实例化第二个 viewController(并在 ivar 或作为属性中保留对它的引用)并将其视图添加到第一个 viewController 的视图中。【参考方案2】:
如果我像这样以编程方式创建 UIView
- (IBAction)didTapOkSocialAction:(id)sender;
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
myView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:myView];
[myView release];
那么 addSubView 是不可避免的。否则 myView 不会出现。我已经测试过了。但如果 UIView 是从笔尖加载的,似乎会有不同的行为。它立即出现。
在第二次测试中,我删除了属性,只剩下局部变量。
【讨论】:
以上是关于UIView 在加载 NIB 文件后立即显示?的主要内容,如果未能解决你的问题,请参考以下文章
为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?