iOS StoryBoard的转场Segue解读

来源:互联网 发布:淘宝囤货小当家 编辑:程序博客网 时间:2024/05/17 10:04

本文参见美国斯坦福大学swift视频,并有所引用原文,特此声明

未完待续

在storyboard中,官方提供了多种转场方式,如图:

这里写图片描述

其含义如下:
1. Show 选项只会在一个导航控制器中用到
2. Show detail 是用于一个分屏控制器或者一个混合设置的,也就是有时你在分屏视图,有时你在导航视图
3. Present Modally 将占满整个屏幕然后展示这个新的 MVC
4. Present As Popover 选项将会把正在 segue 的东西展示在一个小的在最顶级的弹窗中
5. push 以及modal已经被遗弃了

一个控制器的出现的详细生命周期:

override func loadView()override func viewDidLoad()override func viewWillAppear(_ animated: Bool)override func updateViewConstraints()override func viewWillLayoutSubviews()override func viewDidLayoutSubviews()override func viewDidAppear(_ animated: Bool)

一个控制器的消失的详细生命周期:

override func viewWillDisappear(_ animated: Bool)override func updateViewConstraints()override func viewWillLayoutSubviews()override func viewDidLayoutSubviews()override func viewDidDisappear(_ animated: Bool) 

为了验证这个东西,我写了如下代码测试:

override func viewDidAppear(_ animated: Bool) {        super.viewDidAppear(animated)        print(#line)    }    override func viewWillAppear(_ animated: Bool) {        super.viewWillAppear(animated)        print(#line)    }    override func viewDidLayoutSubviews() {        super.viewDidLayoutSubviews()        print(#line)    }    override func viewDidDisappear(_ animated: Bool) {        super.viewDidDisappear(animated)        print(#line)    }    override func viewWillLayoutSubviews() {        super.viewWillLayoutSubviews()        print(#line)    }    override func viewWillDisappear(_ animated: Bool) {        super.viewWillDisappear(animated)        print(#line)    }    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {        super.viewWillTransition(to: size, with: coordinator)        print(#line)    }    override func loadView() {        super.loadView()        print(#line)    }    override func loadViewIfNeeded() {        super.loadViewIfNeeded()        print(#line)    }    override func updateViewConstraints() {        super.updateViewConstraints()        print(#line)    }    override func viewDidLoad() {        super.viewDidLoad()        print(#line)    }

从而得出生命周期如上: 所以我们不能再viewdidload中设置任何有关于几何计算的东西,因为约束还没有建立起来,建议在viewdidappear中设置这些。

在没有navigationcontroller时:

原图:

转场为 – show、show detail、Present Modally、Present As Popover的图层分析:

这时候没有办法返回,需添加返回按钮,通过dismiss,由底部向上推出新的mvc,在iphone中测试并未发现不同。

但是当iphone横屏放置时:

会出现如图所示的状况,这个稍后解释。

此外当我们点击跳转时,捕获函数为:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {        print("-----2222-----")    }

我们可以通过上述方法来获知,UIStoryboardSegue 以及sender

UIStoryboardSegue: 这里有我们需要的属性

    open var identifier: String? { get }    open var source: UIViewController { get }    open var destination: UIViewController { get }

关于如何解决可选值 — optional?

if let name = Person().name {//如果Person().name为空,则不会进行此步}else{}

由于在swift中可以通过?来指定可选值,所以我们可以通过此方法来解除这种为空的情况。当然更好的办法是可选值为空时设置为特定值,如:

if let name = Person().name ?? "quinn" {    //如果Person().name为空,则赋值 "quinn"}

在iPhone中并没有分屏控制器(splitcontroller)只存在与ipad以及横屏状态下的5.5寸iphone上。关于这个你可以查看斯坦福大学的视频。那个教授演示了这个。

原创粉丝点击