Segue
概要
Segue とは?
基本的には、segue を programmatically に呼び出す必要はなく、ランタイムに UIKitによってロード&要素のとの紐付けが行われる。 https://gyazo.com/3d9d246cafa6fb341c3f0bae97fb395c
Segue 利用のメリット
コードをほとんど書かずに遷移を実現できる
非プログラマでもメンテできる
大別すると、主に下記のような種類がある。
結線すると、下記のようなメニューが現れる。
https://gyazo.com/a3343064fd33aedf3a45760f3ab5ec20
このメニューでは、作成する Segue による遷移元と遷移先の 関連の種類 を選択する。 Selection vs Accessory
Selection Segue
Accessory Action
Adaptive vs Non-Adaptive
Adaptive Segue
遷移時の環境に応じて振る舞いを自動的に変更する
Non-Adaptive Segue
Adaptive segue をサポートしていない環境用
iOS 7 (!) でアプリを実行したい時に採用する
Adaptive segue における遷移の振る舞いの種別は以下の通り (Xcode 6 から名称が変更になっている)。
Show (Push)
Show Detail (Replace)
Present Modally
Present as Popover
https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Art/container_view_embed_2x.png
code:swift
class MySegue: UIStoryboardSegue {
override func preform() {
// ...
}
}
ランタイムの挙動
segue を実行すべきかどうか の判断ができるタイミング https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Art/VCPG_displaying-view-controller-using-segue_9-4_2x.png
遷移先に任意の情報を受け渡す
iOS 13 未満
code:FirstViewController.swift
// プロパティが受付可能であることを示すプロトコル
protocol SomePropsAcceptable {
func accept(prop: SomePropType)
}
class FirstViewController: UIViewController {
// 遷移を実行するアクション
func someAction() {
let prop: SomePropType = /* ... */
self.performSegue(withIdentifier: "MySegue", sender: prop)
}
// 遷移直前の割り込み処理
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let acceptable = segue.destination as? SomePropAcceptable {
if let prop = sender as? SomePropType {
acceptable.accept(prop: prop)
}
}
}
}
code:SecondViewController.swift
class SecondViewController: UIViewController {
// ここが mutable かつ implicity unwrapped optional になってしまう
var someProp: SomePropType!
}
extension HogeViewController: SomePropsAcceptable {
func accept(prop: SomePropType) {
self.someProp = prop
}
}
A view controller method annotated with the new @IBSegueAction attribute can be used to create a segue’s destination view controller in code, using a custom initializer with any required values. This makes it possible to use view controllers with non-optional initialization requirements in storyboards.
On new OS versions that support Segue Actions, that method will be called and the value it returns will be the destinationViewController of the segue object passed to prepare(for:sender:).
code:FirstViewController.swift
class FirstViewController: UIViewControlelr {
@IBSegueAction
func makeSecondController(coder: NSCoder, sender: Any?, segueIdentifier: String?) -> ViewController? {
let prop: SomePropType = /* ... */
return SecondViewController(coder: coder, prop: prop)
}
}
code:SecondViewController.swift
class SecondViewController: UIViewController {
// 👍
let someProp: SomePropType
init?(coder: NSCoder, prop: SomePropType) {
self.someProp = prop
super.init(coder: coder)
}
}
Tips: Custom Segue の実用的な例 下記参照。
参考