Trong WWDC 2011 phiên 102, Apple giới thiệu View Controller Containment, đó là khả năng tạo ra giao diện tùy chỉnh container điều khiển, tương tự UITabBarController
, UINavigationController
và những thứ tương tự.
Tôi đã xem các ví dụ vài lần. Có một loạt các phương pháp liên quan đến mô hình này, nhưng hơi khó để tìm ra chúng một cách chính xác. Tôi sẽ đăng ở đây những gì tôi nghĩ đang diễn ra và xem liệu cộng đồng sẽ xác nhận hay bác bỏ những nghi ngờ của tôi.
Tình huống 1: Chuyển từ không có phụ huynh sang bộ điều khiển chế độ xem chính mới
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
Hai dòng đầu tiên phải xảy ra theo thứ tự đã cho, hay chúng có thể bị đảo ngược?
Tình huống 2: Chuyển từ bộ điều khiển chế độ xem chính sang không có bộ điều khiển chế độ xem chính
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
Nó cũng cần thiết để gọi [vc didMoveToParentViewController:nil]
? Các ví dụ trong Phần 102 không thực hiện điều này trong trường hợp này, nhưng tôi không biết liệu đó có phải là một thiếu sót hay không.
Tình huống 3: Chuyển từ bộ điều khiển chế độ xem chính này sang bộ điều khiển chế độ xem chính khác
Điều này có thể xảy ra theo cách sau, vì logic trong mỗi bộ điều khiển chế độ xem cha sẽ được đóng gói.
// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];
Câu hỏi
Câu hỏi chính của tôi là: Đây có phải là cách ngăn chặn bộ điều khiển chế độ xem nên hoạt động không? Các cơ học đưa ra ở trên có đúng không?
Có cần phải gọi điện willMoveToParentViewController
trước khi gọi addChildViewController
không? Điều này có vẻ giống như thứ tự hợp lý đối với tôi, nhưng nó có cần thiết nghiêm ngặt không?
Có cần thiết didMoveToParentViewController:nil
sau khi gọi điện removeFromParentViewController
không?
addChildViewController
nên cân bằng vớididMoveToParentViewController
vàwillMoveToParentViewController
nên cân bằng vớiremoveFromParentViewController
. Điều này thật đúng với gì mà tôi đã tìm kiếm. Không chắc chắn làm thế nào tôi đã bỏ lỡ nó trong tài liệu.