2010-05-04 9 views
6

Tôi đang cố gắng thay đổi bộ điều khiển chế độ xem chính (xuất hiện trong cửa sổ bật lên theo chiều dọc và ở phía bên trái trong khổ ngang) trong UISplitViewController. Tôi muốn chuyển đổi giữa các bộ điều khiển xem chủ là một trong hai UIViewControllers khác nhau (tùy thuộc vào một hành động được thực hiện ở nơi khác trong ứng dụng của tôi).UISplitViewController không thể thay đổi bộ điều khiển chế độ xem chính?

Tôi đang sử dụng như sau:

mySplitViewController.viewControllers = [arrayWithObjects NSArray: newMasterController, detailController, nil];

Điều này sẽ thay đổi chính xác trình điều khiển chế độ xem chính như bạn mong đợi ở chế độ ngang. Tuy nhiên, nó không dường như thay đổi chế độ xem được sử dụng cho cửa sổ bật lên ở chế độ dọc.

Tôi nhận thấy rằng barbuttonitem để hiển thị bộ điều khiển chế độ xem chính này chỉ cần gọi showMasterInPopover: trên splitviewcontroller và vì vậy sẽ mong đợi nó hoạt động ở chế độ dọc, nhưng không.

Trong thực tế, tôi có thể thiết lập bộ điều khiển xem tổng thể, xem mới viewController một cách chính xác trong chế độ phong cảnh, xoay lại để bức chân dung, và viewController sử dụng trong popover là vẫn cũ.

Đây có phải là lỗi không?

Trả lời

1

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).

+0

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. –

+0

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

2

Trong trường hợp bất cứ ai đang tìm kiếm một giải pháp cho vấn đề này (hoặc một từ xung quanh), tôi đã có một vấn đề tương tự và làm việc nó ra ở đây: Changing the master view in Split View does not update the popover in portrait

Về cơ bản, tôi đã sử dụng một bộ điều khiển chuyển hướng cho quan điểm tổng thể bộ điều khiển và bộ điều khiển chế độ xem được đẩy/bật trong bộ điều khiển điều hướng đó, để thay đổi bộ điều khiển chế độ xem trong chế độ xem chính trong khi vẫn hiển thị đúng bộ điều khiển xem theo hướng dọc, trong chế độ xem bật lên.