本文参见美国斯坦福大学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上。关于这个你可以查看斯坦福大学的视频。那个教授演示了这个。