2011-02-02 29 views
5

Tôi mới bắt gặp một thứ mà tôi chưa từng thấy trước đây và tôi nghĩ tôi sẽ hỏi ở đây để xác minh nguyên nhân. Tôi có một UIController người xem được định nghĩa programatically, tôi nhận thấy ngày hôm nay rằng khi tôi nhận xét mã ra khỏi loadView của nó (để kiểm tra cái gì khác) mà cả loadView và viewDidLoad đều được gọi là bốn lần. Suy nghĩ của tôi là bởi vì tôi đã không thiết lập thuộc tính xem iOS đang cố gắng nhiều lần để tải chế độ xem, mặc dù tôi vẫn còn hơi tò mò nếu đây là trường hợp tại sao viewDidLoad cũng được gọi.loadView được gọi nhiều lần khi không xem thuộc tính?

- (void)loadView { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    // MAP VIEW 
    // MKMapView *tempMapView = [[MKMapView alloc] init]; 
    // [tempMapView setDelegate:self]; 
    // [self setView:tempMapView]; 
    // [self setCustomMapView:tempMapView]; 
    // [tempMapView release]; 
} 

điều khiển đầu ra:

2011-02-02 14:10:00.194 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.209 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.212 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.226 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.229 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.243 Xrails[19501:307] -[MapController viewDidLoad] 

2011-02-02 14:10:00.246 Xrails[19501:307] -[MapController loadView] 
2011-02-02 14:10:00.259 Xrails[19501:307] -[MapController viewDidLoad] 
+0

Tôi cũng muốn đăng nhập tự trong loadView đó để đảm bảo rằng những người đang thực sự đến từ cùng MapController – nduplessis

Trả lời

1

Tôi nghĩ rằng có hai điểm ở đây. Trước hết, tôi nghĩ rằng giả định của bạn là đúng trong đó bất cứ điều gì đang kêu gọi xem là nhận được nil trở lại và do đó yêu cầu xem xem bộ điều khiển một lần nữa. Điều này khiến nó trải qua -loadView như được ghi lại cho -view trong documentation for UIViewController.

Vì lý do tại sao -viewDidLoad đang được gọi sau đó, mặc dù nó chưa tải chế độ xem; Tôi tưởng tượng rằng nơi mà -loadView đang được gọi là giả định rằng chế độ xem đã được tải và gọi -viewDidLoad ngay sau đó.

Dù bằng cách nào, nếu bạn tự mình thực hiện -loadView, bạn phải có chế độ xem hợp lệ ở cuối nó.

2

Đặt mã của bạn trong viewDidLoad, và bình luận loadView phương pháp

+0

Khi tôi uncomment mã nó hoạt động tốt, tôi đã chỉ tò mò những gì đang xảy ra. loadView có vẻ là nơi thích hợp để tạo các mục xem vì tôi không sử dụng * .xib – fuzzygoat

+0

Trình truy cập thuộc tính self.view gọi -loadView nếu chế độ xem hiện không được tải. Có thể có sự đệ quy vô hạn của bạn xảy ra. – iHS

9

Add [siêu loadView] vào đầu của phương pháp loadView

+0

Cảm ơn. loadView được gọi là 8 lần và 3 lần khi tôi rời khỏi màn hình thông qua bộ điều khiển điều hướng. Bây giờ tất cả đều tốt. – tazboy

+7

theo tài liệu bạn không nên gọi '[super loadView]' – user102008

+0

Tài liệu nói không gọi loadView trực tiếp. Nó không nói không gọi super.loadView. – Boon

1

override bạn của loadView phải gán một cái nhìn để self.view.

- (void)loadView 
{ 
    self.view = [UIView new]; 
} 

mỗi tài liệu tại https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

Bạn có thể ghi đè phương pháp này để tạo ra quan điểm của bạn bằng tay. Nếu bạn chọn làm như vậy, hãy chỉ định chế độ xem gốc của phân cấp chế độ xem của bạn cho thuộc tính xem . Các khung nhìn bạn tạo nên là các cá thể duy nhất và không được chia sẻ với bất kỳ đối tượng bộ điều khiển chế độ xem nào khác. Việc triển khai tùy chỉnh phương thức này của bạn không nên gọi là siêu.

Có lẽ có một số nơi sâu thẳm trong UIKit nơi một cái gì đó như thế này được gọi là:

if (viewController.view == nil) { 
    [viewController loadView]; 
} 
Các vấn đề liên quan