2011-08-20 30 views
9

Tôi đã điều sau đây trong một bộ điều khiển xem (nơi webView là một biến thể hiện của loại UIWebView):Truy cập self.view.frame trong loadView gây tai nạn EXC_BAD_ACCESS

- (void)loadView 
{ 
    webView = [[UIWebView alloc]initWithFrame:self.view.frame]; 
    [self.view addSubview:webView]; 
} 

Dòng đầu tiên, phân bổ xem web gây ra một vụ tai nạn - tôi nhận được EXC_BAD_ACCESS và một thông điệp trong giao diện điều khiển:

Cảnh báo: Không thể để khôi phục lại khung đã chọn trước đó

Tôi không hiểu điều gì gây ra sự cố; self.view.frame chắc chắn là CGRect.

+2

Bạn nên luôn cung cấp nhật ký sự cố. Thật khó để nói w/o nó. – Anton

+0

Bảng điều khiển cho biết "cảnh báo: Không thể khôi phục khung đã chọn trước đó". và dòng mã được phân bổ UIWebView được tô sáng bằng màu xanh lục và nói "EXC_BAD_ACCESS". – Tom

Trả lời

6

Vì bạn đang sử dụng phương thức loadView, bạn phải tự tạo phân cấp chế độ xem của riêng mình. Kể từ UIWebView là một lớp con của UIView bạn chỉ có thể viết phương pháp loadView của bạn như thế này:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
self.view = webView; 
[webView release]; 

Hoặc bạn có thể bỏ qua bằng loadView và chỉ cần đặt nó trong phương pháp viewDidLoad như thế này:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
[self.view addSubview:webView]; 
[webView release]; 

Tiếp tục xây dựng trên lý do tại sao ứng dụng của bạn bị treo, khi một UIViewController được khởi tạo chế độ xem của nó không được tạo đúng cách. Điều này được gọi là tải chậm, vì vậy bạn đang cố truy cập một giá trị chưa tồn tại.

+0

đừng quên bản phát hành cho webView – progrmr

+0

cảm ơn @progrmr. – ms83

+0

Cảm ơn điều này làm cho mọi thứ rõ ràng hơn rất nhiều. – Tom

6

Bạn không thể sử dụng self.viewaccessor bên trong loadView, bạn chỉ có thể sử dụng trình thiết lập. Lý do là phương thức truy cập view trong UIViewController tải chế độ xem (nếu nó chưa được tải) và vì bạn đã ở trong loadView (tải chế độ xem), nó sẽ gây ra vòng lặp đệ quy vô hạn.

Nếu bạn làm theo các khuôn mẫu cho loadView from this answer bạn sẽ muốn làm điều đó như thay vì điều này:

webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
self.view = webView; 
[webView release]; // don't forget to release 
0

Tôi nghĩ rằng self.view.frame không tồn tại khi loadView được gọi. Bạn có thể đặt mã đó trong viewDidLoad, trong đó self.view được tải và khung đã biết.

1

Bạn đang cố gắng truy cập khung của chế độ xem mà không cần tạo chế độ xem. Bạn có thể tạo chế độ xem và chỉ định chế độ xem là self.view hoặc bạn có thể chỉ cần gọi [super loadView]. Hãy thử mã dưới đây.

- (void)loadView { 

    [super loadView]; 
    webView = [[UIWebView alloc] initWithFrame:self.view.frame]; 
    [self.view addSubview:webView]; 
} 
+0

Tài liệu khuyên bạn không nên gọi đến số điện thoại siêu –

+0

@ Brad Thomas, Thật sao? Tôi không nghĩ vậy. – EmptyStack

+0

https://developer.apple.com/library/ios/Documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#jumpTo_61 –

Các vấn đề liên quan