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
, который будет выполняться в основном потоке для меня.