CẬP NHẬT: vui lòng đọc bản cập nhật cuối cùng ở dưới cùng! Câu trả lời gốc + cập nhật bên dưới có thể không hữu ích!
Chúng tôi vừa có cùng một vấn đề. Đôi khi tôi tự hỏi nếu Apple thực sự kiểm tra các lớp họ viết với bất cứ điều gì giống như trường hợp sử dụng thực tế, bởi vì UISplitViewController không phải là thời điểm tốt nhất của họ.
Vấn đề là khi bạn thay thế bộ điều khiển chế độ xem chính trong chế độ xem chia tách, mã bên trong UISplitViewController không cập nhật thuộc tính contentViewController của trình điều khiển cửa sổ bật lên. Kết quả là bộ điều khiển cửa sổ bật lên vẫn có một bộ điều khiển trên bộ điều khiển chế độ xem lỗi thời, dẫn đến giao diện người dùng cũ xuất hiện hoặc thậm chí lỗi bộ nhớ, khi ở chế độ dọc.
Đây là giải pháp thay thế của chúng tôi.
Tôi giả định rằng bạn có lớp phù hợp UISplitViewControllerDelegate lưu trữ popoverController làm thuộc tính lớp (xem mã mẫu chuẩn cho UISplitViewController).
Tại điểm mà tại đó bạn thiết lập bộ điều khiển xem chủ mới, bạn cũng cần phải cập nhật contentViewController, như sau:
mySplitViewController.viewControllers
= [NSArray arrayWithObjects:newMasterController, detailController, nil];
// in the cases where the uisplitview has already shown a popovercontroller,
// we force the popovercontroller to update its content view controller.
// This ensures any old content view in popover actually gets released by
// the popovercontroller.
if (popoverController) {
[popoverController setContentViewController:theMasterViewController
animated:NO];
}
Bạn cũng phải thiết lập contentViewController của popover khi UISplitViewControllerDelegate của bạn được thông báo rằng popover bộ điều khiển sẽ hiển thị trình điều khiển chế độ xem:
- (void)splitViewController:(UISplitViewController*)svc
popoverController:(UIPopoverController*)pc
willPresentViewController:(UIViewController *)aViewController
{
// set the popoverController property - as per Apple's sample code
self.popoverController = pc;
// THE LINE BELOW IS THE NEW LINE!
[popoverController setContentViewController:aViewController animated:NO];
Có, tôi biết mã trên trông có vẻ điên rồ và bạn không thể tự đặt bộ điều khiển chế độ xem nội dung. Nhưng họ dường như không, và đây là sửa chữa.
CẬP NHẬT
Đề án trên, với thiết lập các nội dung xem, hóa ra không phải để làm việc sau khi tất cả. Ví dụ: nếu bạn đặt chế độ xem nội dung thành bộ điều khiển truy vấn, sau đó bạn sẽ được chuyển qua chế độ xem gốc bên trong trình điều khiển điều hướng, thay vì chính trình điều khiển điều hướng. UISplitViewController chỉ không xử lý việc thay đổi chế độ xem chính theo bất kỳ cách nào khả thi, theo như tôi thấy.
Cách giải quyết hiện tại là cài đặt UINavigationController làm chế độ xem chính và thay đổi bộ điều khiển chế độ xem gốc của trình điều khiển điều hướng đó. Vì vậy, tôi có thể thay đổi cái nhìn tổng thể 'bằng cửa sau', theo một cách nào đó.
CẬP NHẬT 2
tôi bỏ cuộc. Cách tiếp cận trong bản cập nhật đầu tiên ở trên là thiếu sót; Tôi gặp vấn đề khi xoay vòng. Về cơ bản, có vẻ như nếu bạn sử dụng UISplitViewController, bạn không nên thử bất kỳ thay đổi nào của bộ điều khiển chế độ xem chính (ngay cả khi bạn đang chuyển chế độ xem chính khi chế độ xem chính, ví dụ như cửa sổ bật lên, đã bị ẩn một lần nữa). Việc sử dụng nội dung của UINavigationController trong chế độ xem chính (trong khi chế độ xem chính hiển thị) xuất hiện giống như nó sẽ ổn, nhưng bất kỳ thứ gì ngoài đó dẫn đến sự cố sau sự cố.
Lưu ý kỹ thuật: Tôi tin rằng các vấn đề xuất phát từ một điểm yếu trong xử lý UI của Apple: cụ thể là mã Apple sẽ phát hành trên UIViews và bộ điều khiển sau khi bị ẩn hoặc bị xóa khỏi chế độ xem, nhưng sau đó, được hiển thị một lần nữa, gửi các tin nhắn hoãn lại như viewDidDisappear đến các khung nhìn/bộ điều khiển đã được phát hành (mà tại thời điểm đó có thể đã được deallocated).
Có rất nhiều lỗi với UISplitViewController. Điều này dường như là một trong những điều tồi tệ nhất. Tôi vẫn thấy những vấn đề này như của iOS SDK 5.1. Tuy nhiên, có vẻ như giải pháp thay thế liên quan đến việc sử dụng UINavigationController vì Chế độ xem chính gốc không hoạt động trong phiên bản này. –
Chà, vẫn tệ thế này, muộn rồi? Cảm ơn bạn đã cập nhật cho chúng tôi Dan. – occulus