Storyboard优势
可视化的设计APP页面以及控制页面间的切换。Xcode项目中会预设两个Storyboard页面,一个是Main.storyboard,是APP默认的首页面,可以在这里设计页面之间的切换。另一个是LaunchScreen.storyboard,是APP一开始载入时的欢迎界面(tips:一般不涉及太复杂的逻辑以好看为主,这里不作讨论)。 Storyboard帮助我们省去了页面中控件的创建,但是具体的逻辑仍需要代码实现。Storyboard在开发中,往往扮演连接可视化控件和代码的中间角色。因此Storyboard可以做到:(一)连接控件发出的各种事件,例如点击、键盘输入等(二)可以唯一标识一个控件,例如为控件取名(相当于声明变量),这样才能通过代码定位到我们想要操作的控件,改变控件的属性。
操作控件
直接用鼠标拉蓝线到某一ViewController中,输入名字就完成了命名,相当于声明了一个控件变量,Xcode会自动帮我们转成一个特殊类型的属性——IBOutlet属性。如果想要拦截某一控件的事件,同样采取拉线的方式,也会被转为一个特殊方法——IBAction方法,当事件触发时,这个方法就会被调用。(进入辅助编辑模式快捷键:control+option+command+enter 一只手刚刚够0.0)
视图控制器与视窗
APP中,不同界面的切换其实是切换视图控制器而不是视窗。一个APP通常只有一个视窗(类型为UIWindow),视窗上有一个视图控制器,视图控制器上可以放置不同的视图,也就是各种控件。
界面切换Segue
Storyboard中,将某一ViewController中的控件拉线至另一ViewController就定义了ViewController之间的切换。切换方式分为多种,如show(全屏幕方式切换,由导航控制器控制);show detail(通常用于分屏);present modally(多样化的切换方式);present as popover(小弹窗方式)。 通过给Segue命名的方法,可以在prepare(for:sender:)函数中作一系列操作。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "你设定的segue名字" {
let vc = segue.destination as! UIViewController
vc.value = "hello world"
}
}
Unwind Segue用于返回上一个页面,在Storyboard中,将一个控件(如按钮)拉线到另一个ViewController的Exit按钮上,就可以选择unwindFor:这个函数,之后为其命名,就可以在unwind函数中进行一系列操作。注:unwind函数并不能拉线产生,但是其前面仍需要加上@IBAction,unwind函数名称可以自定义,但是参数类型必须是UIStoryboardSegue。
@IBAction func unwind(for segue: UIStoryboardSegue) {
if segue.identifier == "你设定的segue名字" {
let vc = segue.source as! UIViewController
vc.value = "hello world"
}
}
通过代码切换界面
Segue切换界面虽然容易,但是APP中的界面逻辑较为复杂时,segue的结构同样会变得非常复杂难以维护,因此通常通过代码的方式来进行界面之间的切换。而且有些ViewController是不支持segue切换方式的,例如PageViewController。 首先新建一个MyViewController类。之后在Stroyboard中新建一个ViewController,设置其Class属性为MyViewController(可以理解为将该ViewController交由MyViewController类管理),设置Identity中的Storyboard ID(名字任取,例如newVC)。在另一个ViewController中,创建一个控件(以按钮举例),用拉线的方式拦截按钮的onClick事件。
@IBAction func onClick(_ sender: Any) {
let vc = storyboard?.instantiateViewController(withIdentifier: "newVC")
show(vc!, sender: self)
}
|