UIView在加载NIB文件后显示immedialtelly?

时间:2012-05-29 15:54:16

标签: ios uiview nib addsubview

我尝试将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,而不是视图加载到的视图控制器。

2 个答案:

答案 0 :(得分:2)

您的socialActionView已绑定到其超级视图中的视图占位符。

所以:它已经存在(它的引用已经作为子视图添加)但在实际加载之前它是nil

编辑:目前尚不清楚你是如何将所有内容连接起来的,但是根据你在下面添加的信息,我会猜测一下。

试试这段代码:

- (IBAction)didTapOkSocialAction:(id)sender;
{
    UIView *loadedView = [[[NSBundle mainBundle] loadNibNamed:@"SocialActionViewController" owner:self options:nil] objectAtIndex:0];

    [self.view addSubview:loadedView];
}
编辑:因为你想以编程的方式从.xib加载一个viewcontroller你可以这样做(可以看看viewController是在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];

答案 1 :(得分: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,似乎有不同的行为。它会立即显示出来。

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