Giống như đối với nhiều người bạn, tôi cần một người 'cách phương thức' để sử dụng UISplitViewController. Điều này có vẻ là một vấn đề cũ, nhưng tất cả những gì tôi thấy trong StackOverflow là giải thích lý do tại sao vấn đề xảy ra khi bạn cố gắng làm như vậy (như câu trả lời được chấp nhận ở trên), hoặc 'hack-arounds'.
Tuy nhiên, đôi khi nó cũng không phải là rất thuận tiện để thay đổi nhiều mã cơ sở của bạn và làm cho một UISplitViewController đối tượng ban đầu chỉ để có được chức năng của nó lên và chạy.
Hóa ra, có một cách để làm cho mọi người hạnh phúc (bao gồm cả các nguyên tắc của Apple). Các giải pháp mà tôi thấy tốt nhất, là sử dụng các UISplitViewController bình thường, nhưng khi cần thiết sẽ được hiển thị/miễn nhiệm, sử dụng phương pháp sau đây:
-(void)presentWithMasterViewController: (UIViewController *) thisMasterViewController
andDetailViewController: (UIViewController *) thisDetailViewController
completion:(void(^)(void))completion
{
masterViewController = thisMasterViewController;
detailViewController = thisDetailViewController;
[self setViewControllers:[NSArray arrayWithObjects:masterViewController, detailViewController, nil]];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
self.window.rootViewController = self;
[self.window makeKeyAndVisible];
if(completion)
completion();
}
-(void)dismissViewControllerWithCompletion:(void (^)(void))completion
{
self.window = nil;
masterViewController = nil;
detailViewController = nil;
if(completion)
completion();
}
đâu "cửa sổ", là một tài sản của lớp con UISplitViewController của bạn. Và hệ thống sẽ chăm sóc phần còn lại!
Để thuận tiện/tài liệu tham khảo, Tôi đã tải lên này như một lớp con UISplitViewController để GitHub:
ModalSplitViewController
--EXAMPLE về cách sử dụng -
mySplitViewController = [[ModalSplitViewController alloc] init];
mySplitViewController.delegate = self;
[mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil];
// when done:
[mySplitViewController dismissViewControllerWithCompletion:nil];
mySplitViewController = nil;
Side-lưu ý: Tôi đoán hầu hết các sự nhầm lẫn bắt nguồn từ thực tế là ví dụ sử dụng UISplitView từ tài liệu của Apple sử dụng cửa sổ được tạo trong appDelegate và thực tế là hầu hết mọi người không phải là rất quen thuộc với khái niệm cửa sổ - bởi vì chúng ta thường không cần (chúng được tạo một lần trong StoryBoards hoặc mã soạn sẵn).
Ngoài ra, nếu bạn đang thực hiện khôi phục trạng thái, không được quên rằng UIViewControllers được lập trình sẽ không tự động khôi phục bởi hệ thống.
một sự thay thế là để thử một bộ điều khiển aftermarket splitview trên cho kích thước, như https://github.com/SlavaBushtruk/APSplitViewController –
upvoted cho "view controller Aftermarket" –