TL; DR Ви можете мати лише 1 rootViewController та найновіший представлений. Тому не намагайтеся, щоб контролер перегляду подав інший вигляд, якщо він уже представлений, той, який не був відхилений.
Зробивши кілька власних тестів, я прийшов до висновку.
Якщо у вас є rootViewController, який ви хочете представити все, то ви можете зіткнутися з цією проблемою.
Ось мій код rootController (відкритим є мій ярлик для подання виду контролера з кореня).
func open(controller:UIViewController)
{
if (Context.ROOTWINDOW.rootViewController == nil)
{
Context.ROOTWINDOW.rootViewController = ROOT_VIEW_CONTROLLER
Context.ROOTWINDOW.makeKeyAndVisible()
}
ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: {})
}
Якщо я закликаю відкрити двічі поспіль (незалежно від часу, що минув), це буде спрацьовувати чудово на першому відкритому, а НЕ на другому відкритому. Друга відкрита спроба призведе до помилки вище.
Однак якщо я закриваю останнє представлене подання, то дзвінок відкритий, він спрацьовує чудово, коли я знову закликаю відкрити (на іншому контролері перегляду).
func close(controller:UIViewController)
{
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
}
Я зробив висновок про те, що rootViewController лише MOST-RECENT-CALL знаходиться в Ієрархії перегляду (навіть якщо ви не відхилили його чи не видалили подання). Я спробував грати з усіма дзвінками навантажувача (viewDidLoad, viewDidAppear і робити зворотні відправки), і я виявив, що єдиний спосіб, коли я міг би змусити його працювати, ТІЛЬКИ викликає подарунок від самого контролера самого перегляду.
presentViewController:animated:completion
на навігаційний контролер. Ви робите це в делегаті програми?