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

714   12  

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)

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

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

enter image description here

просто используйте это : убедитесь, что использование 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() from viewDidLoad, потому что первый вид еще не готов.

вот исправление:

  1. вызов present() from viewDidAppear такой:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        let yourVC = YourViewController()
        self.present(yourVC, animated: true, completion: nil)
    }
    

    как только в вашем приложении появится" вид", вы можете начать вызывать present() из viewDidLoad().

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

Comments

    Ничего не найдено.