2011-12-05 28 views
103

Trong WWDC 2011 Phiên 102, Apple đã giới thiệu View Controller Containment, đây là khả năng tạo vùng chứa bộ điều khiển chế độ xem tùy chỉnh, tương tự như UITabBarController, UINavigationController và các loại tương tự.Chế độ xem Ngăn xếp bộ điều khiển hoạt động như thế nào trong iOS 5?

Tôi đã xem các ví dụ một vài lần. Có một loạt các phương pháp liên kết với mẫu này, nhưng có một chút khó khăn để tìm ra 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 có xác nhận hay không xác nhận những nghi ngờ của tôi.

Kịch bản 1: Chuyển từ không có cha mẹ để một bộ điều khiển xem mẹ mới

[vc willMoveToParentViewController:self]; 
[self addChildViewController:vc]; 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 

Do hai dòng đầu tiên phải xảy ra theo trình tự nhất định, hoặc họ có thể bị đảo ngược?

Kịch bản 2: Chuyển từ một bộ điều khiển xem cha mẹ không xem điều khiển cha mẹ

[vc willMoveToParentViewController:nil]; 
[vc.view removeFromSuperview]; 
[vc removeFromParentViewController]; 

là nó cũng cần thiết để gọi [vc didMoveToParentViewController:nil]? Các ví dụ trong Phiên 102 không làm đ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.

Kịch bản 3: Di chuyển từ điều khiển xem một phụ huynh khác

này có khả năng sẽ xảy ra theo cách sau, bởi vì logic trong mỗi bộ điều khiển xem phụ huynh 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à thế này: Đây có phải là cách xem điều khiển ngăn chặn nên làm việc, nói chung? Các cơ chế được đưa ra ở trên có chính xác không?

Có cần phải gọi willMoveToParentViewController trước khi gọi addChildViewController? Điều này có vẻ như thứ tự hợp lý với tôi, nhưng nó có cần thiết không?

Có cần gọi số didMoveToParentViewController:nil sau khi gọi removeFromParentViewController không?

+9

Vấn đề là khi tôi cố gắng thêm thẻ ios5, tôi vô tình nhấn enter, mà thêm vào các bài mặc dù tôi đã không sáng tác/chỉnh sửa nó kết thúc. Tôi đã cố gắng xóa nó nhưng sau đó thấy rằng tôi chỉ có thể * bỏ phiếu * để xóa nó. –

Trả lời

71

Tài liệu UIViewController khá rõ ràng về thời gian và thời điểm không gọi phương thức willMove/didMove. Xem tài liệu "Implementing a Container View Controller".

Các tài liệu nói rằng nếu bạn không ghi đè addChildViewController, bạn không phải gọi phương thức willMoveToParentViewController:. Tuy nhiên, bạn cần gọi phương thức didMoveToParentViewController: sau khi quá trình chuyển đổi hoàn tất. "Tương tự như vậy, trách nhiệm của bộ điều khiển xem bộ chứa để gọi phương thức willMoveToParentViewController: trước khi gọi phương thức removeFromParentViewController. Phương pháp removeFromParentViewController gọi phương thức didMoveToParentViewController: của bộ điều khiển xem con."

Ngoài ra, có một ví dụ được thực hiện here và mã mẫu here.

Good Luck

+15

Tôi thấy, vì vậy 'addChildViewController' nên được cân bằng với' didMoveToParentViewController' và 'willMoveToParentViewController' nên được cân bằng với' removeFromParentViewController'. Đ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ị mất nó trong tài liệu. –

+0

Tại sao không? Tại sao bạn không phải gọi willMoveToParentViewController nhưng hae để gọi didMoveToParentViewController? –

+0

Bởi vì đó là những gì các tài liệu nói. Apple rõ ràng cảm thấy chúng ta không cần phải biết. –

21

Phần này là không đúng:

[vc willMoveToParentViewController:self]; 
[self addChildViewController:vc]; 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 

According to the docs:

Khi thùng chứa tùy chỉnh của bạn gọi addChildViewController: phương pháp, nó tự động gọi willMoveToParentViewController: phương pháp quan điểm bộ điều khiển được thêm vào như một đứa trẻ trước khi thêm nó.

Vì vậy, bạn không cần cuộc gọi [vc willMoveToParentViewController:self]. Nó được thực hiện tự động khi bạn gọi [self addChildViewController:vc]. Dưới đây là các mẫu mã một lần nữa:

[self addChildViewController:vc]; 
// [vc willMoveToParentViewController:self] called automatically 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 

For removing view controllers:

Phương pháp removeFromParentViewController tự động gọi didMoveToParentViewController: phương pháp điều khiển xem con sau khi nó loại bỏ đứa trẻ.

Có lẽ cuộc gọi này là [oldVC didMoveToParentViewController:nil].

[vc willMoveToParentViewController:nil]; 
[vc.view removeFromSuperview]; 
[vc removeFromParentViewController]; 
// [vc didMoveToParentViewController:nil] called automatically 
+0

nó xuất hiện rằng nếu thực hiện khác, ngay cả khi nó có vẻ làm việc, presentingViewController không được thiết lập trên presentationViewController. – Adrian

+0

Tài liệu nói gọi 'didMoveToParentViewController'" ** ngay lập tức ** sau khi gọi phương thức addChildViewController: ", nó không chỉ định khi bạn thực sự thêm subview con. Tôi tự hỏi liệu mọi người có sai không. Có một ví dụ trong một số tài liệu Apple chúng tôi có thể kiểm tra điều này chống lại? – Robert

+0

Lưu ý: bạn * cần * cần gọi 'willMoveToParentViewController' trước' addChildViewController' nếu mục bạn đang di chuyển là một lớp tùy chỉnh với ghi đè 'addChildViewController' (trừ khi ghi đè của bạn gọi nội bộ) – bunkerdive

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