我在视图控制器中有以下内容(其中webView
是UIWebView
类型的实例变量):
- (void)loadView
{
webView = [[UIWebView alloc]initWithFrame:self.view.frame];
[self.view addSubview:webView];
}
分配Web视图的第一行导致崩溃 - 我在控制台中收到EXC_BAD_ACCESS和消息:
警告:无法恢复以前选择的框架
我不明白导致事故的原因; self.view.frame
绝对是CGRect
。
答案 0 :(得分:7)
您无法在loadView中使用self.view
访问者,您只能使用setter。原因是UIViewController中的view
访问器方法加载了视图(如果它尚未加载),并且由于您已经在loadView中(加载视图),它将导致无限递归循环。
如果你按照loadView from this answer的模式进行操作,你会想要这样做:
webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release]; // don't forget to release
答案 1 :(得分:6)
由于您使用的是loadView方法,因此必须手动创建自己的视图层次结构。由于UIWebView是UIView的子类,因此您可以像这样编写loadView方法:
webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = webView;
[webView release];
或者您可以跳过使用loadView并将其放在viewDidLoad方法中,如下所示:
webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:webView];
[webView release];
为了进一步详细说明应用程序崩溃的原因,在实例化UIViewController时,其视图不是正确创建的。这称为延迟加载,因此您尝试访问尚不存在的值。
答案 2 :(得分:1)
您试图访问视图的框架,甚至不创建视图。您可以创建一个视图并将其指定为self.view
,也可以只调用[super loadView]
。请尝试以下代码。
- (void)loadView {
[super loadView];
webView = [[UIWebView alloc] initWithFrame:self.view.frame];
[self.view addSubview:webView];
}
答案 3 :(得分:0)
我认为调用self.view.frame
时loadView
不存在。您可以将该代码放在viewDidLoad
中,其中self.view
已加载且已知帧。