Swift - 使用addSubview()方法将StoryBoard中的视图加载进来
(本文代码已升级至Swift3)
但除了segue,我们还可以使用纯代码的方式实现Storyboard界面的跳转。
比如:使用 presentViewController() 方法将当前页面视图切换成新视图
本文介绍第三种方式:使用addChildViewController()将StoryBoard中的ViewController加载进来
比如下面的storyboard,左边一个是初始页面,点击上面的“加载”按钮,希望能把右边的logo页的视图加载进来。

我们可以通过 self.view.addSubview() 方法将另一个VC视图加载进来:

所以除了用 addSubview() 方法把视图添加进来,还要用 addChildViewController() 方法将视图对应的视图控制器给加载进来。
下面是最终的代码:
let myNavigaiton = UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "myNavigaiton") as! UINavigationController self.present(myNavigaiton, animated: false, completion: nil)
如果有视图导航控制器的话,还可以使用 self.navigationControler.pushViewController 和 popViewController 来实现前进到下一个视图或回到上一个视图。
let viewController = UIStoryboard(name: "Second", bundle: nil) .instantiateViewController(withIdentifier: "SecondView") as UIViewController self.navigationController?.pushViewController(viewController, animated: true)
本文介绍第三种方式:使用addChildViewController()将StoryBoard中的ViewController加载进来
比如下面的storyboard,左边一个是初始页面,点击上面的“加载”按钮,希望能把右边的logo页的视图加载进来。

我们可以通过 self.view.addSubview() 方法将另一个VC视图加载进来:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func btnClick(sender: AnyObject) { //从StoryBoard中获取视图控制器 let logoView = UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "logoView") //添加获取到的视图控制器的视图 self.view.addSubview(logoView.view) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }但运行后发现会发现个问题,图片错位了,也就是说logo页上定义的约束条件失效了。这是由于我们没将logo页对应的视图控制器添加进来。

所以除了用 addSubview() 方法把视图添加进来,还要用 addChildViewController() 方法将视图对应的视图控制器给加载进来。
下面是最终的代码:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func btnClick(sender: AnyObject) { //从StoryBoard中获取视图控制器 let logoView = UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "logoView") //添加获取到的视图控制器的视图 self.view.addSubview(logoView.view) //添加子视图控制器 addChildViewController(logoView) logoView.didMove(toParentViewController: self) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }运行后可以看到,页面显示正常了。

如果不用storyboard呢可以吗
//添加子视图控制器
addChildViewController(logoView) 是不是应该写成self.addChildViewController(logoView) 为什么不写也不会报错?
是不是Swift self可直接调用的语法self.都可以省去?