Tôi chỉ mới nhúng chân vào phát triển iOS, và một trong những điều đầu tiên tôi phải làm là triển khai custom container view controller - cho phép gọi nó là SideBarViewController
- hoán đổi một số bộ điều khiển có thể xem con hiển thị, gần như chính xác giống như Bộ điều khiển Thanh tab tiêu chuẩn. (Đó là khá nhiều Tab Bar khiển nhưng với một menu bên hideable thay vì một thanh tab.)addChildViewController thực sự làm gì?
Theo các hướng dẫn trong tài liệu hướng dẫn của Apple, tôi gọi addChildViewController
bất cứ khi nào tôi thêm một đứa trẻ ViewController để container của tôi. Mã của tôi để bơm nạp tiếp ra bộ điều khiển xem con hiện tại được hiển thị bởi các SideBarViewController
trông như thế này:
- (void)showViewController:(UIViewController *)newViewController {
UIViewController* oldViewController = [self.childViewControllers
objectAtIndex:0];
[oldViewController removeFromParentViewController];
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self addChildViewController: newViewController];
[self.view addSubview: newViewController.view];
}
Sau đó, tôi bắt đầu cố gắng tìm ra chỉ là những gì addChildViewController
làm ở đây, và tôi nhận ra rằng tôi không có ý tưởng. Bên cạnh việc gắn bó mới ViewController
trong mảng .childViewControllers
, có vẻ như không ảnh hưởng đến bất kỳ thứ gì. Các hành động và cửa hàng từ giao diện điều khiển con cho bộ điều khiển con mà tôi đã đặt trên bảng phân cảnh vẫn hoạt động tốt ngay cả khi tôi không bao giờ gọi addChildViewController
và tôi không thể tưởng tượng điều gì khác có thể ảnh hưởng.
Thật vậy, nếu tôi viết lại mã của tôi để không gọi addChildViewController
, và thay vào đó trông như thế này ...
- (void)showViewController:(UIViewController *)newViewController {
// Get the current child from a member variable of `SideBarViewController`
UIViewController* oldViewController = currentChildViewController;
[oldViewController.view removeFromSuperview];
newViewController.view.frame = CGRectMake(
0, 0, self.view.frame.size.width, self.view.frame.size.height
);
[self.view addSubview: newViewController.view];
currentChildViewController = newViewController;
}
... sau đó ứng dụng của tôi vẫn hoạt động hoàn hảo, cho đến nay như tôi có thể nói!
Tài liệu của Apple không làm sáng tỏ những gì addChildViewController
làm hoặc tại sao chúng tôi phải gọi nó. Toàn bộ phạm vi của mô tả có liên quan về phương pháp hoặc tại sao nó nên được sử dụng trong phần của nó trong UIViewController
Class Reference là, hiện tại:
Thêm bộ điều khiển xem đã cho. ... Phương pháp này chỉ nhằm mục đích được gọi bằng cách triển khai bộ điều khiển chế độ xem vùng chứa tùy chỉnh. Nếu bạn ghi đè phương thức này, bạn phải gọi siêu trong triển khai của mình.
Ngoài ra còn có đoạn này trước đó trên cùng một trang:
view controller chứa của bạn phải kết hợp một bộ điều khiển xem đứa trẻ với bản thân trước khi thêm xem gốc của đứa trẻ để hệ thống phân cấp xem. Điều này cho phép iOS định tuyến đúng sự kiện cho bộ điều khiển chế độ xem con và chế độ xem mà các trình điều khiển quản lý. Tương tự, sau khi loại bỏ chế độ xem gốc của con từ cấu trúc phân cấp của chế độ xem, nó sẽ tự ngắt kết nối với trình điều khiển chế độ xem con đó. Để tạo hoặc phá vỡ các liên kết này, vùng chứa của bạn gọi các phương thức cụ thể được xác định bởi lớp cơ sở. Các phương thức này không có ý định được gọi bởi các máy khách của lớp container của bạn; chúng chỉ được sử dụng bởi việc triển khai vùng chứa của bạn để cung cấp hành vi ngăn chặn dự kiến.
Sau đây là các phương pháp cần thiết bạn có thể cần phải gọi:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
nhưng nó không cung cấp bất kỳ đầu mối như những gì 'sự kiện' hoặc 'hành vi ngăn chặn dự kiến' mà nó đang nói đến là, hoặc tại sao (hoặc ngay cả khi) gọi những phương pháp này là 'thiết yếu'. Các ví dụ về bộ điều khiển chế độ xem thùng chứa tùy chỉnh trong phần "Bộ điều khiển chế độ xem bộ chứa tùy chỉnh" của tài liệu Apple đều gọi phương pháp này, vì vậy tôi giả sử rằng nó phục vụ một số mục đích quan trọng ngoài việc bật ViewController con lên một mảng, nhưng tôi không thể tìm ra mục đích đó là gì. Phương pháp này làm gì và tại sao tôi nên gọi nó?
của Apple [** 2011 ** WWDC] (https://developer.apple.com/videos/wwdc/2011/) trang video có phiên _great_ ("Triển khai Ngăn chứa UIViewController") về chủ đề này. – Alladinian