加载NIB文件后,UIView立即显示?

3
我试图在应用程序中添加一个UIView。它确实起作用,但不是我期望的那样。我在头文件中定义了socialActionView,并在我的视图控制器中进行了@synthesize。
当用户选中按钮时,nib文件被加载。我认为我必须调用addSubview方法来显示视图。但即使我不这样做,它也会显示出来。
如果我无论如何调用addSubView方法,当我加载视图并收到“warning: Unable to restore previously selected frame.”消息时,应用程序会崩溃。
有人能解释一下这里发生了什么吗?我不明白。
- (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添加到加载视图的视图控制器之外。

2个回答

2

您的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
@rockstarberlin:你最好将其立即加载,并将hidden属性设置为YES,当用户点击按钮时再取消隐藏。但这取决于你的应用程序结构和层次结构,所以我无法确定。 - Rok Jarc
@rockstarberlin:当然,addSubview仍然是必需的,只是在其他情况下。至于你的第二个测试:很奇怪——如果你有同名的属性和局部变量,编译器至少应该发出警告。 - Rok Jarc
嗯,也许你是对的。我认为在需要时加载东西是更好的做法。谢谢你的回答。 - rockstarberlin
1
在这种情况下,你必须实例化第二个视图控制器(并将其引用保留为实例变量或属性),并将其视图添加到第一个视图控制器的视图中。 - Rok Jarc
显示剩余11条评论

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将不会出现。我已经测试过了。但是如果从nib中加载UIView,则似乎有不同的行为。它会立即显示。

在第二个测试中,我删除了属性,只剩下局部变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接