79

我以编程方式在 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调用另一个。这可以做到吗?

4

13 回答 13

126

试试这个:

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

使用 Swift3:

self.present(vc, animated: true, completion: nil)
于 2014-06-07T16:59:29.740 回答
111

对于那些获得空白/黑屏的人,此代码对我有用。

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

要将“标识符”设置为您的 VC,只需转到情节提要中 VC 的身份检查器即可。将“故事板 ID”设置为您想要的标识符。请看下面的图片以供参考。

于 2014-10-09T19:40:39.643 回答
21

作为参考,因为这个问题是第一个谷歌结果之一。

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)
于 2016-10-06T08:00:05.930 回答
19

斯威夫特 3 和斯威夫特 4

let vc = self.storyboard?.instantiateViewController(withIdentifier: "idMyViewControllerName") as! MyViewControllerName
self.present(vc, animated: true, completion: nil)
于 2016-12-09T08:54:08.900 回答
8

对我来说,我在两个独立的导航控制器中有两个视图。我不得不使用上述的组合。

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("WelcomeViewController") as! WelcomeViewController
    var navigationController = UINavigationController(rootViewController: vc)
    self.presentViewController(navigationController, animated: true, completion: nil)

斯威夫特 3.x

        let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "VC-ID" as! yourViewController
        let navigationVC = UINavigationController(rootViewController: secondVC)
        self.present(navigationVC, animated: true, completion: nil)
于 2015-12-13T14:49:26.543 回答
6

使用 Swift 2.1+

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

在此处输入图像描述

于 2015-11-03T00:49:24.713 回答
4

通过添加导航控制器并将第二个视图控制器设置为rootVC解决了黑屏。

let vc = ViewController()       
var navigationController = UINavigationController(rootViewController: vc)
self.presentViewController(navigationController, animated: true, completion: nil
于 2015-03-06T23:56:25.847 回答
4

只需使用这个:确保使用 nibName 否则预加载的 xib 视图将不会显示:

var vc : ViewController = ViewController(nibName: "ViewController", bundle: nil)//把这个改成你的类名

 self.presentViewController(vc, animated: true, completion: nil)
于 2015-05-24T03:30:03.653 回答
1

您不需要为了让present()ViewController 工作而在 Storyboard 中实例化 ViewController。这是一个骇人听闻的解决方案。

如果您在展示 VC 时看到黑屏/空白屏幕,可能是因为您present()viewDidLoad()First/RootViewController 中调用,但第一个 View 尚未准备好。

打电话present()viewDidAppear解决这个问题,即:

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

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

一旦任何“视图”出现在您的应用程序中,您就可以开始从viewDidLoad().


使用UINavigationController(如答案中所建议)是另一种选择,但解决此问题可能有点过头了。您最终可能会使用户流程复杂化。UINavigationController仅当您想要拥有 NavigatonBar 或想要返回到之前的视图控制器时才使用基于解决方案。

于 2018-09-09T16:57:52.993 回答
0

您可以使用以下代码:

var vc = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController;
            vc.mode_Player = 1
            self.presentViewController(vc, animated: true, completion: nil)
于 2015-09-05T08:24:45.307 回答
0

另一种可能性是您的构建目标中没有包含 XIB(这就是发生在我身上的事情)。

如果您有不同的开发、测试和发布构建目标(无论如何您都应该有),则可能会发生这种情况。

于 2016-05-21T22:18:01.327 回答
0

我有一个类似的问题,但就我而言,解决方案是将操作作为异步任务分派到主队列中

DispatchQueue.main.async {
    let vc = self.storyboard?.instantiateViewController(withIdentifier: myVCID) as! myVCName
    self.present(vc, animated: true, completion: nil)
}
于 2020-07-27T22:45:31.170 回答
-1

您可以使用代码:

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? secondViewController {
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = vc
}
于 2017-10-30T03:42:00.970 回答