Swift - 使用addSubview()方法将StoryBoard中的视图加载进来
作者:hangge | 2016-05-11 08:40
(本文代码已升级至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()
}
}
运行后可以看到,页面显示正常了。
全部评论(2)
如果不用storyboard呢可以吗
站长回复:本文介绍的就是加载StoryBoard视图,如果不用StoryBoard的话就是我们平时开发中加载普通视图。
//添加子视图控制器
addChildViewController(logoView) 是不是应该写成self.addChildViewController(logoView) 为什么不写也不会报错?
是不是Swift self可直接调用的语法self.都可以省去?
站长回复:是的,通常情况下self.都可以省去