2012-04-13 44 views
55

Tôi đang cố gắng tạo bộ điều khiển chế độ xem vùng chứa bằng cách sử dụng iOS5 và các phương pháp mới như addChildViewController.Tôi có phải gọi addSubview sau khi gọi addChildViewController không?

Tôi có phải gọi số addSubview sau khi gọi addChildViewController không?

Tôi có phải gọi removeFromSuperview trước khi gọi removeChildViewController không?

Tôi không thấy bất kỳ điều gì về điều này trong tài liệu của Apple. Bạn nghĩ sao?

Trả lời

40

Câu trả lời ngắn: "Có, và có". Phân cấp chế độ xem và chế độ xem bộ điều khiển vẫn còn độc lập. API ngăn chặn chỉ cho phép các khung nhìn từ các bộ điều khiển khác hiển thị trong khung nhìn của trình điều khiển chính một cách rõ ràng và nhất quán.

Bạn có thể tìm thấy một chút trong Apple's docs here ... đây là một đoạn có liên quan từ "View Controller container Sắp xếp nội dung của Xem Bộ xử lý khác":

Một container quản lý phân cấp hình ảnh giống như cái nhìn khác bộ điều khiển làm. Một vùng chứa cũng có thể thêm các khung nhìn của bất kỳ phần tử con nào của nó vào phân cấp khung nhìn của nó. Vùng chứa sẽ quyết định khi nào một chế độ xem như vậy được thêm và kích thước của nó như thế nào để phù hợp với phân cấp chế độ xem của vùng chứa, nhưng nếu không trình điều khiển chế độ xem con vẫn chịu trách nhiệm cho chế độ xem và các bản xem con của nó.

Nếu bạn có quyền truy cập, tôi đặc biệt khuyên bạn nên xem video WWDC 2011 có tên "Triển khai UIViewController Ngăn chặn" (watch in Safari | view in iTunes).

+1

Cảm ơn rất nhiều.Nếu tôi phá hủy thùng chứa, tôi có phải gọi removeViewFromSuperview không? Hoặc thậm chí removeChildViewController? – Ricardo

80

1) Tôi có phải gọi addSubview sau khi gọi addChildViewController không?

2) Tôi có phải gọi removeFromSuperview trước khi gọi removeChildViewController?

Không khá

Bạn nên gọi removeFromParentViewController: thay vì removeChildViewController: Bạn cũng nên gọi willMoveToParentViewController:

Để thêm/gỡ bỏ, bạn có thể tham khảo loại vĩ đại này:

UIViewController + Container

- (void)containerAddChildViewController:(UIViewController *)childViewController { 

    [self addChildViewController:childViewController]; 
    [self.view addSubview:childViewController.view]; 
    [childViewController didMoveToParentViewController:self]; 

} 

- (void)containerRemoveChildViewController:(UIViewController *)childViewController { 

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

} 

Official resource at developer.apple.com

+1

Rất hữu ích cho danh mục đó. Cảm ơn rất nhiều. – Ricardo

+0

Chính xác những gì tôi đang tìm kiếm! Cảm ơn bạn Peter –

+0

+1 Danh mục rất hữu ích. Cảm ơn bạn. –

2

Thêm vào Phêrô trả lời: một lý do tôi tìm thấy cho gọi addChildViewController trước addSubview là khi addSubview được gọi thì viewDidLoad của đứa trẻ có được được gọi là, và trong một số trường hợp, bạn sẽ muốn có thứ bậc cha mẹ và con đúng cách thiết lập tại thời điểm đó. Nếu điều đó không được thực hiện, trong khi viewDidLoad của cha, thuộc tính parentViewController sẽ là 0.

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