Панель навигации исчезает. Измените корневой ViewController, а затем переназначьте

Я сделал экран запуска корневым представлением, в то время как мое приложение отправляет запрос в firebase, а затем переназначает корневое представление после завершения запроса. К сожалению, когда я делаю это, моя панель навигации исчезает или закрывается новым корневым представлением. Когда я запускаю симулятор, я ненадолго вижу панель навигации, а затем она закрывается моим TableViewController. Как мне не допустить этого?

Вот мой код из AppDelegate, где я все это делаю:

    var window: UIWindow?
let searchManager = SearchManager()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    makeRootViewLaunchScreen()
    FirebaseApp.configure()
    searchManager.getMosaicTitles { results in
        self.searchManager.listOfMosaics = results
        self.stopDisplayingLaunchScreen()
    }
    // Adds border to bottom of the nav bar
    UINavigationBar.appearance().shadowImage = UIImage.imageWithColor(color: UIColor(red:0.00, green:0.87, blue:0.39, alpha:1.0))
    // Override point for customization after application launch.
    return true
}

func makeRootViewLaunchScreen() {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "LaunchScreen", bundle: nil)
    let viewController = mainStoryboard.instantiateViewController(withIdentifier: "launchScreen")
    UIApplication.shared.keyWindow?.rootViewController = viewController
}

func stopDisplayingLaunchScreen() {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = mainStoryboard.instantiateViewController(withIdentifier: "centralViewController") as? SearchResultsTableViewController
    viewController?.searchManager = searchManager
    UIApplication.shared.keyWindow?.rootViewController = viewController
    UIApplication.shared.keyWindow?.rootViewController?.navigationController?.isNavigationBarHidden = false
}

Как вы можете видеть, я пытался использовать UIApplication.shared.keyWindow?.rootViewController?.navigationController?.isNavigationBarHidden = false, чтобы заставить панель навигации появляться, но это не так. Мое приложение по-прежнему выглядит так: как это выглядит без панели навигации


person Ben Nalle    schedule 18.10.2017    source источник


Ответы (2)


Вы устанавливаете UIViewController в качестве корневого контроллера. Что вы хотите сделать, так это установить UINavigationController в качестве корневого контроллера.

Либо создайте новый навигационный контроллер в своей раскадровке и загрузите его вместо загрузки «centralViewController», либо измените свою функцию следующим образом:

func stopDisplayingLaunchScreen() {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "centralViewController") as? SearchResultsTableViewController {

        viewController.searchManager = searchManager

        // create a new UINavigationController
        let newNavVC = UINavigationController()

        // set the "root" VC of the NavVC to your SearchResultsTableViewController
        newNavVC.setViewControllers([viewController], animated: false)

        // use the new NavVC as the new rootViewController
        UIApplication.shared.keyWindow?.rootViewController = newNavVC
        UIApplication.shared.keyWindow?.rootViewController?.navigationController?.isNavigationBarHidden = false

    }
}

Примечание: не тестировалось, но это должно помочь вам.

Изменить: другой подход...

Вместо замены корневого контроллера ключевого окна создайте ViewController, который указывает, что вы инициализируете/извлекаете свои данные. Этот VC может быть «корнем» навигационного контроллера.

Поместите свою функцию searchManager.getMosaicTitles в этот VC. По завершении замените текущий контроллер «запуска» в Nav Controller на ваш TableVC. Это будет выглядеть примерно так:

// note: searchManager will have to be a reference back to AppDelegate.searchManager
searchManager.getMosaicTitles { results in
    self.searchManager.listOfMosaics = results

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "centralViewController") as? SearchResultsTableViewController {

        viewController.searchManager = searchManager

        // replace the current Nav VC stack with the new SearchResultsTableViewController
        self.navigationController.setViewControllers([viewController], animated: false)

    }
}
person DonMag    schedule 18.10.2017
comment
Когда я использую приведенный выше код и запускаю его в симуляторе, это короткий момент, когда вы видите мою старую панель навигации, а затем появляется новая. Как это исправить? Удалить старый навигационный контроллер? - person Ben Nalle; 18.10.2017
comment
Не уверен... на вашем месте я бы заменил текущий контроллер представления текущим контроллером навигации вместо замены .keyWindow?.rootViewController - person DonMag; 18.10.2017
comment
Существует также раздражающая задержка, когда панель навигации загружается, а затем пользователь видит отображение таблицы. - person Ben Nalle; 18.10.2017
comment
Я не совсем понимаю, что вы подразумеваете под заменой текущего контроллера представления в текущем контроллере навигации вместо замены .keyWindow?.rootViewController, не могли бы вы уточнить? - person Ben Nalle; 18.10.2017

Чтобы предотвратить задержку между появлением контроллера панели навигации и появлением tableView, проверьте следующее. Предотвратить исчезновение панели навигации без задержки

person Ben Nalle    schedule 19.10.2017