2011-09-11 35 views
5

Tôi muốn thiết lập UIViewController trong một NavigationController lập trình, tuy nhiên phương thức loadView và viewDidLoad không được gọi.loadView của UIViewController không được gọi là

Đây là mã của tôi trong các đại biểu ứng dụng:

MyViewController *viewController = [[MyViewController alloc] init]; 
UIView *view = [[UIView alloc] initWithFrame:window.frame]; 
viewController.view = view; 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

Khi tôi bắt đầu ứng dụng tôi thấy một Navigationbar, nhưng không có cuộc gọi đến loadView. Tôi đang thiếu gì? Tôi nghĩ loadView được gọi sau khi bạn gọi view

Sửa

MyViewController *viewController = [[MyViewController alloc] init]; 
[viewController view]; // doesn't look right? 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

sửa đối với bình luận của Giôna, nhưng loadView vẫn không được gọi.

Trả lời

10

Một UIViewController sẽ tạo ra quan điểm của mình (bằng cách tải nó từ một ngòi bút hoặc thực hiện -loadView) khi getter view của bộ điều khiển được gọi và quan điểm của mình hiện đang nil.

Trong mã được hiển thị, bạn không bao giờ gọi trình thu thập của thuộc tính chế độ xem, chỉ có trình thiết lập của nó.

Ngoài ra, bạn đang chỉ định chế độ xem của bộ điều khiển từ đại biểu ứng dụng của mình. UIViewController s dự kiến ​​sẽ tạo ra quan điểm riêng của họ theo yêu cầu, không có chúng được cung cấp bởi một số lớp khác. Cách tiếp cận này sẽ gây ra cho bạn các vấn đề sau này khi bạn nhận ra rằng bộ điều khiển dỡ bỏ quan điểm của nó và cố gắng tạo lại nó để đáp lại các cảnh báo bộ nhớ. Hãy để bộ điều khiển của bạn tạo ra cái nhìn của nó, không cố gắng vượt qua nó.

+0

Về nhận xét thứ hai của bạn, chỉ định chế độ xem, bạn có nghĩa là dòng mã thứ 2 và thứ 3 của tôi, phải không? Điều đó có ý nghĩa. Nhưng làm thế nào tôi sẽ gọi getter trong trường hợp này? –

+0

'[viewController view]' gọi getter của khung nhìn nhưng không cần bạn làm điều đó trực tiếp. 'UINavigationController' bạn đã thêm bộ điều khiển xem của mình để gọi hàm getter tại một số điểm để thêm khung nhìn của trình điều khiển của bạn vào hệ thống phân cấp khung nhìn. Bạn có thể chia sẻ việc triển khai bộ điều khiển chế độ xem của mình không? Có vẻ như bạn có điều gì khác đang diễn ra. – Jonah

+0

Về cơ bản, mẫu UIViewController trống từ Xcode, nhưng không có phương thức (xem) nào được gọi ngoài init. Ở đó tôi đã cố gắng thiết lập chế độ xem như sau: - (id) init { \t self ((self = [super init])) { \t UIView * view = [[UIView alloc] initWithFrame: [[UIScreen mainScreen] bounds] ]; \t self.view = view; \t [xem bản phát hành]; \t} trả lại tự; } –

2

có thể bạn không phải đối mặt với vấn đề này ... nhưng ngày khác tôi chạy vào cùng một rắc rối khó chịu .. loadView, viewDidLoad và viewWillAppear không được gọi trong UIViewController của tôi.

Vấn đề của tôi là v. Đơn giản nhưng hơi khó để bắt nếu bạn không cẩn thận. Thay vì viết

-(void) loadView 

tôi đã viết:

-(void) loadview 

Xin lưu ý rằng điều này sẽ không sa thải bất kỳ cảnh báo. Sự khác biệt của "V" và "v" trong loadView có thể dễ dàng bị bỏ qua. Và rõ ràng, vì loadView không được gọi, viewDidLoad/viewWillAppear sẽ không được gọi hoặc vì không có chế độ xem nào được tải (không sử dụng bất kỳ nib..tạo chế độ xem theo chương trình).

-Anshu

2

Một Gotcha đáng chú ý là nếu bạn định nghĩa một

@synthesize view; 

mà không có một @property phù hợp trong việc thực hiện của bạn, điều này có thể dẫn đến các cuộc gọi đến bằng không trở về điều khiển quan điểm của bạn, và không có cuộc gọi vào phương thức loadView của bạn.

+1

Aha! Điều này đã cho tôi. Tôi đã kết thúc với một cái nhìn "@synthesize" trong một lớp học do một hoạt động tìm kiếm/thay thế quá mức, không nhận ra nó, và tất cả đột ngột quan điểm của tôi hoàn toàn trống vì loadView không bao giờ được gọi nữa. Điều này là khó khăn để theo dõi. Cảm ơn! –

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