3

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

4

2 回答 2

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 是从笔尖加载的,似乎会有不同的行为。它立即出现。

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

于 2012-05-29T17:44:43.707 回答
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];
于 2012-05-29T16:00:05.687 回答