2009-12-20 24 views
9

Giả sử tôi tải bộ điều khiển chế độ xem từ ngòi bút, và quyết định làm điều gì đó với một trong các chế độ xem phụ của nó đằng sau cảnh. Tại một thời điểm sau đó, tôi sẽ hiển thị khung nhìn của bộ điều khiển khung nhìn này.Thực hiện chế độ xem (được khởi tạo từ initWithNibName) tải tất cả subview của nó

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething]; 

//later on 
[mainView addSubview:viewController.view]; 

Vấn đề là, đối tượng someSubview dường như không được nạp cho đến khi nhìn xuất hiện, vì vậy phương pháp doSomething không được gọi. Cho đến nay, giải pháp thay thế của tôi là gọi:

[mainView addSubview:viewController.view]; 
[viewController.view removeFromSuperview]; 

để khởi tạo các bản xem trước của chế độ xem trước. Có cách nào thanh lịch hơn (giống như phương thức loadSubviews hay gì đó) cho tác vụ này không?

Trả lời

23

Trước hết tôi sẽ cố gắng chỉ đơn giản là truy cập thuộc tính:

[viewController view]; 

Điều này sẽ buộc tải lười biếng của view (và do đó subviews và các cửa hàng vv) và điều này có thể đủ cho bạn. Xem bộ điều khiển theo mặc định sẽ không tải chế độ xem của họ cho đến khi bạn truy cập vào vì vậy đây có thể là lý do bạn thấy sự chậm trễ.

Việc buộc tải như thế này thường là giải pháp khi bạn đang cố gắng truy cập thuộc tính cửa hàng nhưng chưa thực sự bị ràng buộc, chẳng hạn như someSubview trong trường hợp của bạn.

Bạn cũng có thể cải thiện tình hình một chút bằng cách thêm quan điểm nhưng làm cho nó ẩn:

viewController.view.hidden = YES; 
[mainView addSubview:viewController.view]; 

Sau đó, thay vì gọi addSubview khi bạn muốn hiển thị nó, chỉ cần làm:

viewController.view.hidden = NO; 

tôi đã sử dụng phương pháp này khi hoạt ảnh trong chế độ xem bằng cách sử dụng các chuyển đổi UIViewAnimationTransitionFlipFromRight vv. Ngay cả khi buộc một tải lười biếng của xem vẫn còn một tụt hậu đáng chú ý, vì vậy tôi đã sử dụng điều này để cải thiện hiệu suất một chút.

+0

Cảm ơn, mà đã làm nó. – iamj4de

+0

@MarkAmery Apple cho bạn biết rõ ràng là không gọi hàm -loadView trong tài liệu: "Bạn không bao giờ nên gọi trực tiếp phương thức này. Trình điều khiển chế độ xem gọi phương thức này khi thuộc tính chế độ xem của nó được yêu cầu nhưng hiện không có. gán nó cho thuộc tính xem. " –

+0

@MikeWeller Điểm tốt - Tôi chưa xem tài liệu đủ chặt chẽ để biết điều đó. Tôi đoán chúng ta phải lựa chọn giữa một trong hai hacks hơi xấu xí, sau đó. Về phần tôi, tôi có lẽ sẽ dính vào 'loadView' chỉ vì nó rõ ràng hơn, nhưng tôi thừa nhận rằng nó không phải là giải pháp sạch mà tôi nghĩ là vậy. –

0

iOS 9 giới thiệu -(void) loadViewIfNeeded

tôi sử dụng

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) { 
    [_myVC loadViewIfNeeded]; 
} else { 
    [_myVC view]; 
} 
Các vấn đề liên quan