Lưu ý khi sử dụng view controller containment API
Trước iOS 5, ta thường lập trình theo kiểu 1 controller - một màn hình. Tuy nhiên, đối với các thiết bị có màn hình lớn như iPad, ta thường muốn một vùng màn hình được quản lý bởi 1 controller, và các vùng khác được quản lý bởi các controller khác.
Với iOS 5, Apple đã cung cấp bộ API để một controller có thể chứa một controller khác vì thế controller bây giờ không nhất thiết phải quản lý toàn màn hình mà quản lý một khu vực tự quản.
API rất đơn giản, nếu muốn thêm một controller con vào một controller cha, trước tiên ta addSubView: các view của controller con vào controller cha, sau đó addChildViewController: controller con vào controller cha, cuối cùng thông báo cho controller cha biết đã hoàn thành bằng method didMoveToParentViewController:
[self.view addSubview:childViewController.view]; [self addChildViewController:childViewController]; [detailViewController didMoveToParentViewController:self];
Nếu muốn remove một controller con khỏi controller cha, đầu tiên ta thông báo cho controller cha biết nó sắp rời khỏi thằng bố nó bằng method willMoveToParentViewController:, sau đó lần lượt removeFromSuperView và removeFromParentViewController:
[self willMoveToParentViewController:nil]; // 1 [self.view removeFromSuperview]; // 2 [self removeFromParentViewController]; // 3
Lưu ý là khi remove thì thứ tự luôn luôn phải là removeFromSuperView trước sau đó mới được removeFromParentViewController. Nếu bạn thử hoán đổi thứ tự hai dòng 2 và 3, bạn sẽ gặp một lỗi EXC_BAD_ACCESS. Thông thường để debug lỗi này, ta nên enable Zoombie Object trong Edit Scheme của project.