我尝试将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,而不是视图加载到的视图控制器。
答案 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,似乎有不同的行为。它会立即显示出来。
在第二次测试中我删除了属性,只剩下局部变量。