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 文件后立即显示?的主要内容,如果未能解决你的问题,请参考以下文章

ios - 从 nib 文件加载解耦视图

为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?

使用 nib 作为带有 nib 类的表节标题

自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

无法将 NIB 文件加载到 UIView

如何重新加载 UIView?