Как и многим из вас, мне нужен «модальный способ» использовать UISplitViewController. Кажется, это старая проблема, но все, что я нашел в StackOverflow, было в лучшем случае объяснением, почему проблема возникает, когда вы пытаетесь это сделать (например, принятый ответ выше) или «обходные пути».
Однако иногда также не очень удобно изменять большую часть вашей кодовой базы и делать UISplitViewController начальным объектом просто для того, чтобы его функциональность была запущена и работала.
В свою очередь, есть способ сделать всех счастливыми (включая рекомендации Apple). Решение, которое я нашел лучше всего, состояло в том, чтобы использовать UISplitViewController в обычном режиме, но при необходимости показать / отклонить, используйте следующий подход:
-(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();
}
Где "window" - это свойство вашего подкласса UISplitViewController. А система позаботится обо всем остальном!
Для удобства / ссылки я загрузил это как подкласс UISplitViewController в gitHub:
ModalSplitViewController
- ПРИМЕР, КАК ИСПОЛЬЗОВАТЬ -
mySplitViewController = [[ModalSplitViewController alloc] init];
mySplitViewController.delegate = self;
[mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil];
// when done:
[mySplitViewController dismissViewControllerWithCompletion:nil];
mySplitViewController = nil;
Примечание: я полагаю, что большая часть путаницы проистекает из того факта, что
пример использования UISplitView из документации Apple использует окно
создан в приложении Delegate, и за то, что большинство людей не
так знаком с концепцией окна - потому что нам обычно не нужно
to (они создаются один раз в StoryBoards или шаблонном коде).
Кроме того, если вы делаете восстановление состояния, не следует
забудьте, что программно созданные UIViewControllers не будут
автоматически восстанавливаться системой.