it-roy-ru.com

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. Можно ли это сделать?

63
Z-Tech

Попробуй это:

let vc = ViewController() //change this to your class name
self.presentViewController(vc, animated: true, completion: nil)

С Swift3:

self.present(vc, animated: true, completion: nil)
101
Adam

Для тех, кто получает пустые/черные экраны, этот код работает для меня.

    let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
    self.present(vc, animated: true, completion: nil)

Чтобы установить «Идентификатор» для своего VC, просто перейдите в инспектор идентификации для VC в раскадровке. Установите «Storyboard ID» на то, что вы хотите, чтобы идентификатор был. Посмотрите на изображение ниже для справки .

86
boidkan

Для справки, потому что этот вопрос является одним из первых результатов Google.

Срочные перемены в 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)
19
Arnlen

Swift 3 и Swift 4

let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)
13
Kaptain

Для меня у меня было два представления в двух отдельных контроллерах навигации. Мне пришлось использовать комбинацию вышеперечисленного.

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)
7
Keith Holliday

Использование Swift 2.1+

 let vc = self.storyboard?.instantiateViewControllerWithIdentifier("settingsVC") as! SettingsViewController
 self.presentViewController(vc, animated: true, completion: nil)

 enter image description here

6
ColossalChris

Просто используйте это: убедитесь, что с помощью nibName иначе предварительно загруженные представления xib не будут отображаться:

var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil) // измените это на ваше имя класса

 self.presentViewController(vc, animated: true, completion: nil)
4
Alok

Решил черный экран добавив контроллер навигации и установив второй контроллер вида как rootVC.

let vc = ViewController()       
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
2
AMG

Вы можете использовать код:

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = vc
}
0
tvtruong

Вы можете использовать ниже код: 

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
            vc.mode_Player = 1
            self.presentViewController(vc, animated: true, completion: nil)
0
Lê Trường Giang

Вам не нужно создавать экземпляр ViewController в Storyboard только для того, чтобы заставить present() ViewController работать. Это хакерское решение. 

Если вы видите черный/пустой экран при представлении VC, это может быть связано с тем, что вы вызываете present() из viewDidLoad() в First/RootViewController, но первое представление еще не готово.

Вызовите present() из viewDidAppear, чтобы исправить это, т.е.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let yourVC = YourViewController()
    self.present(yourVC, animated: true, completion: nil)
}

Как только в вашем приложении появился «View», вы можете начать вызывать present () из viewDidLoad()


Использование UINavigationController (как предлагается в ответе) является еще одним вариантом, но это может быть излишним решением этой проблемы. Вы можете усложнить поток пользователей. Используйте решение на основе UINavigationController, только если вы хотите иметь NavigatonBar или хотите вернуться к предыдущему контроллеру представления.

0
Nitin Nain

Другая возможность состоит в том, что вы не включили XIB в свою цель сборки (что и случилось со мной).

Это может произойти, если у вас есть другая цель для Dev, Test & Release Builds (которая у вас должна быть в любом случае).

0
Ger