Swift программно перемещается на другой контроллер/сцену просмотра

Я использую следующий код для программного перехода к другому ViewController. Он отлично работает, но он как-то скрывает navigation bar. Как это исправить? (панель навигации создается путем вставки ViewController в navigation controller, если это имеет значение.)

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

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

Ответы

Ответ 1

В Swift 3

С программно созданным контроллером

Если вы хотите перейти к Controller, созданному Programmatically, выполните следующие действия:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

С созданным контроллером StoryBoard

Если вы хотите перейти к контроллеру на StoryBoard с идентификатором "newViewController", выполните следующие действия:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

Ответ 2

Вы должны нажать новый диспетчер представлений, используя текущий контроллер навигации, не присутствуя.

self.navigationController.pushViewController(nextViewController, animated: true)

Ответ 3

Итак, если вы представляете контроллер вида, он не будет отображаться в контроллере навигации. Он просто займет полный экран. Для этого случая вам нужно создать еще один контроллер навигации и добавить к нему nextViewController как root для этого и представить этот новый диспетчер навигации.

Другой способ - просто нажать контроллер вида.

self.presentViewController(nextViewController, animated:true, completion:nil)

Подробнее о документации Apple: - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96

Ответ 4

Согласно @jaiswal Rajan в его ответе. Вы можете сделать pushViewController следующим образом:

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)

Ответ 5

SWIFT 4.x

Строки в двойных кавычках меня всегда путают, поэтому я думаю, что для ответа на этот вопрос нужно какое-то графическое представление, чтобы прояснить это.

Для банковского приложения у меня есть LoginViewController и BalanceViewController. Каждый из них имеет свои экраны.

Приложение запускается и показывает экран входа в систему. Когда вход успешно завершен, приложение открывает экран "Баланс".

Вот как это выглядит:

enter image description here

enter image description here

Успех входа в систему выполняется следующим образом:

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

Как вы можете видеть, идентификатор ID "раскладки" в маленьких буквах - это то, что входит во вторую строку кода, и это идентификатор, который определен в настройках раскадровки, как показано на скриншоте.

Термин "Баланс" с капиталом "B" - это имя файла раскадровки, который используется в первой строке кода.

Мы знаем, что использование жестко закодированных строк в коде - очень плохая практика, но как-то в разработке iOS это стало обычной практикой, и Xcode даже не предупреждает о них.

Ответ 6

OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

Это сработало для меня, когда я ввел код внутри OperationQueue.main.addOperation, который будет выполняться в основном потоке для меня.