Tôi chỉ mới nhúng chân lần đầu tiên vào việc 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 bộ điều khiển chế độ xem vùng chứa tùy chỉnh - hãy gọi nó SideBarViewController
- điều đó sẽ hoán đổi nó. gần giống như một Bộ điều khiển thanh tab tiêu chuẩn . (Nó khá giống một Bộ điều khiển thanh tab nhưng với menu bên có thể ẩn thay vì thanh tab.)
Theo hướng dẫn trong tài liệu của Apple, tôi gọi addChildViewController
bất cứ khi nào tôi thêm ViewController con vào vùng chứa của mình. Mã của tôi để hoán đổi bộ điều khiển chế độ xem trẻ em hiện tại được hiển thị SideBarViewController
như sau:
- (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 những gì addChildViewController
xảy ra ở đây, và tôi nhận ra rằng tôi không biết. Ngoài việc dính cái mới ViewController
trong .childViewControllers
mảng, nó dường như không ảnh hưởng gì cả. Các tác vụ và cửa ra từ chế độ xem của bộ điều khiển trẻ em đến bộ điều khiển trẻ em 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 nó có thể ảnh hưởng gì khác.
Thật vậy, nếu tôi viết lại mã của mình để 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;
}
... thì ứng dụng của tôi vẫn hoạt động hoàn hảo, theo 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 được hoặc tại sao chúng ta nên gọi nó như vậy. Toàn bộ phạm vi mô tả có liên quan về chức năng của phương pháp hoặc lý do tại sao nó nên được sử dụng trong phần của nó trong UIViewController
Tham chiếu Lớp , hiện tại:
Thêm bộ điều khiển chế độ xem đã cho khi còn nhỏ. ... Phương thức 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 super trong triển khai của mình.
Cũng có đoạn này trước đó trên cùng một trang:
Bộ điều khiển chế độ xem vùng chứa của bạn phải liên kết bộ điều khiển chế độ xem con với chính nó trước khi thêm chế độ xem gốc của trẻ vào hệ thống phân cấp chế độ xem. Điều này cho phép iOS định tuyến đúng các sự kiện đến bộ điều khiển chế độ xem con và chế độ xem mà bộ điều khiển đó quản lý. Tương tự như vậy, sau khi nó xóa chế độ xem gốc của một đứa trẻ khỏi hệ thống phân cấp chế độ xem của nó, nó sẽ ngắt kết nối bộ điều khiển chế độ xem con đó khỏi chính nó. Để 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 nhằm mục đích được gọi bởi các máy khách thuộc lớp vùng chứa của bạn; chúng chỉ được sử dụng khi triển khai vùng chứa của bạn để cung cấp hành vi ngăn chặn dự kiến.
Dưới đây là các phương thức thiết yếu mà bạn có thể cần gọi:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
nhưng nó không cung cấp bất kỳ manh mối nào về 'sự kiện' hoặc 'hành vi ngăn chặn dự kiến' mà nó đang nói đến, hoặc tại sao (hoặc thậm chí khi) gọi các phương thức này là 'thiết yếu'.
Các ví dụ về bộ điều khiển chế độ xem vùng chứa tùy chỉnh trong phần "Bộ điều khiển chế độ xem vùng chứa tùy chỉnh" của tài liệu Apple đều gọi phương thức 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 chỉ đưa ViewController con vào một mảng, nhưng tôi không thể hình dung mục đích đó là gì. Phương thức này làm gì và tại sao tôi nên gọi nó?