Swift presentViewController
у меня программно есть несколько контроллеров представления в проекте iOS Swift. У меня нет раскадровки и хотел бы избежать их, если это возможно. Есть ли способ переключиться на другой viewcontroller.swift файл (назовем его view2.swift) и это должно быть частью функции, которую вызывает кнопка?
Я пробовал следующие:
let storyboard: UIStoryboard = UIStoryboard(name: "myTabBarName", bundle: nil)
let vc: UIViewController = storyboard.instantiateViewControllerWithIdentifier("myVCID") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)
выше работает с раскадровками, но я хочу другой view2.swift называться. Можно ли это сделать?
12 ответов:
попробуйте это:
let vc = ViewController() //change this to your class name self.presentViewController(vc, animated: true, completion: nil)С Swift3:
self.present(vc, animated: true, completion: nil)
для тех, кто получает пустые / черные экраны этот код работал для меня.
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("myVCId") as! MyVCName self.presentViewController(vc, animated: true, completion: nil)чтобы установить "идентификатор" для вашего VC, просто перейдите в Инспектор идентификации для VC в раскадровке. Установите "идентификатор раскадровки" на то, что вы хотите, чтобы идентификатор был. Посмотрите на изображение ниже Для справки.
Для справки, потому что этот вопрос является одним из первых результатов в Google.
Breaking change in Swift 3:
метод
presentViewControllerзаменяется методомpresent.вы можете использовать его как старый:
self.present(viewControllerToPresent, animated: true, completion: nil)пример открытия камеры:
let imagePicker = UIImagePickerController() imagePicker.delegate = self imagePicker.sourceType = UIImagePickerControllerSourceType.camera imagePicker.allowsEditing = false self.present(imagePicker, animated: true, completion: nil)
Swift 3 и Swift 4
let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName self.present(vc, animated: true, completion: nil)
для меня у меня было два представления в двух отдельных навигационных контроллерах. Мне пришлось использовать комбинацию из вышеперечисленного.
var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController var navigationController = UINavigationController(rootViewController: vc) self.presentViewController(navigationController, animated: true, completion: nil)Swift 3.x
let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController let navigationVC = UINavigationController(rootViewController: secondVC) self.present(navigationVC, animated: true, completion: nil)
просто используйте это : убедитесь, что использование nibName в противном случае предустановленные представления xib не будут отображаться :
var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil)/ / измените это на имя классаself.presentViewController(vc, animated: true, completion: nil)
решил черный экран, добавив навигационный контроллер и установив второй контроллер вида как rootVC.
let vc = ViewController() var navigationController = UINavigationController(rootViewController: vc) self.presentViewController(navigationController, animated: true, completion: nil
вы можете использовать ниже код :
var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController; vc.mode_Player = 1 self.presentViewController(vc, animated: true, completion: nil)
другая возможность заключается в том, что у вас нет XIB, включенного в вашу цель сборки (что и произошло со мной).
Это может произойти, если у вас есть другая цель для сборки Dev, Test & Release (которую вы должны иметь в любом случае).
вы можете использовать код:
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController { let appDelegate = UIApplication.shared.delegate as! AppDelegate appDelegate.window?.rootViewController = vc }
вам не нужно создавать экземпляр ViewController в раскадровке, чтобы получить
present()ViewController для работы. Это хакерское решение.если вы видите черный / пустой экран при представлении VC, это может быть потому, что вы звоните
present()С Первая/Корень ViewController. В этом случае вы не можете вызвать present() fromviewDidLoad, потому что первый вид еще не готов.вот исправление:
вызов
present()fromviewDidAppearтакой:override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let yourVC = YourViewController() self.present(yourVC, animated: true, completion: nil) }как только в вашем приложении появится" вид", вы можете начать вызывать present() из
viewDidLoad().используя
UINavigationController(как предлагается в ответе) - это еще один вариант, но это может быть излишним для решения этой проблемы. Вы можете в конечном итоге усложнить поток пользователей. ИспользуйтеUINavigationControllerрешение на основе только если вы хотите иметь NavigatonBar или хотите вернуться к предыдущему контроллеру вида.


Comments