当前位置: > > > Swift - 使用addSubview()方法将StoryBoard中的视图加载进来

Swift - 使用addSubview()方法将StoryBoard中的视图加载进来

(本文代码已升级至Swift3)

使用 Storyboard 我们可以很方便地搭建好各种复杂的页面,同时通过 segue 连接可以轻松实现页面的跳转。

但除了segue,我们还可以使用纯代码的方式实现Storyboard界面的跳转。 
 
比如:使用 presentViewController() 方法将当前页面视图切换成新视图
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()
    }
}
运行后可以看到,页面显示正常了。
源码下载:hangge_1167.zip
评论2
  • 2楼
    2016-08-25 15:19
    发 是的

    如果不用storyboard呢可以吗

    站长回复

    本文介绍的就是加载StoryBoard视图,如果不用StoryBoard的话就是我们平时开发中加载普通视图。

  • 1楼
    2016-05-11 21:20
    mapanguan

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

    站长回复

    是的,通常情况下self.都可以省去