Использование функции splitviewcontroller на iPhone сначала отображает подробный вид

В настоящее время я разрабатываю iOS 8 и разрабатываю приложение с новой адаптивной картой. Странная часть - это когда я использую контроллер splitview на iPhone с этой конфигурацией раскадровки, приложение не запускается с контроллера главного представления, а контроллера детали. Является ли это ошибкой и как я могу ее исправить? enter image description here

Это происходит, только если навигационный контроллер, который огибает мастер, существует, если я удалю его, приложение запускается с помощью главного контроллера.

Ответ 1

Вероятно, это ошибка из-за того, что SplitViewController является эксклюзивным для iPad. Также, когда у вас есть это в портретной ориентации, он отображает подробный вид по умолчанию, и мастер-представление будет отображаться как панель. Вам придется изменить его, используя некоторый метод, например splitViewController:shouldHideViewController:inOrientation

Вот документ Apple, ссылающийся на вашу проблему

https://developer.apple.com/library/ios/documentation/uikit/reference/UISplitViewController_class/Reference/Reference.html

Надеюсь, это поможет!

Ответ 2

Понятно, что когда приложение для просмотра с открытым списком открывается на iPhone 6 Plus в портрете, оно просто показывает контроллер разделенного представления в сворачиваемом состоянии. По умолчанию это имеет подробный вид, расположенный над любыми контроллерами представлений в основном навигационном контроллере.

Способ остановки определенного вида (например, пустой подробный вид, который вы можете сначала показать на iPad), отображаться при запуске или, действительно, после любого поворота на портрет, должен обрабатывать это в splitViewController: collapseSecondaryViewController: onPrimaryViewController: делегата. Это будет вызываться при запуске на iPhone или iPhone 6 Plus в портрете перед представлением.

Выполняя это, вам не нужно иметь какой-либо конкретный код устройства.

В простейшем виде это выглядело бы так:

- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController
{
    if ([secondaryViewController isKindOfClass:[BlankViewController class]])
    {
        // If our secondary controller is blank, do the collapse ourself by doing nothing.
        return YES;
    }

    // Otherwise, use the default behaviour. 
    return NO;
}

Очевидно, что тогда вам нужно сделать обратное в splitViewController: separateSecondaryViewControllerFromPrimaryViewController: создать и вернуть BlankViewController для нового вторичного представления, если вы не хотите, чтобы ваш верхний контроллер первичного представления заканчивался на стороне детализации после того, как расширенное представление расширяется.

Имейте в виду смешение собственной реализации с Apple в этих методах, они делают некоторые сумасшедшие вещи, такие как встраивание UINavigationControllers внутри других UINavigationControllers. См. Мой ответ: fooobar.com/questions/494891/...

Ответ 3

ОБНОВЛЕНИЕ: ответ Майкла Виброу лучше.

Я столкнулся с этой проблемой и нашел, что это работает:

splitViewController.viewControllers =
    UIScreen.mainScreen.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact ?
    @[ leftNavigationController ] :
    @[ leftNavigationController, rightNavigationController ]
;

И в делегате splitview:

- (UIViewController *)primaryViewControllerForCollapsingSplitViewController:(UISplitViewController *)splitViewController
{
    return leftNavigationController;
}

- (UIViewController *)primaryViewControllerForExpandingSplitViewController:(UISplitViewController *)splitViewController
{
    return leftNavigationController;
}

- (UIViewController *)splitViewController:(UISplitViewController *)splitViewController separateSecondaryViewControllerFromPrimaryViewController:(UIViewController *)primaryViewController
{
    return rightNavigationController;
}

Это ужасно, я знаю. Но он делает правильные вещи, особенно на iPhone 6 Plus, что очень сложно сделать правильно.

ОБНОВЛЕНИЕ: ответ Майкла Виброу лучше.