【SwiftUI】delegateを理解してUIKitの機能をSwiftUIで利用する
・SwiftUIを中心に学習している方のdelegateの理解
上記の内容とこのページを左右に開き(2画面など)比較しながら進めると理解がより深まると思います。
はじめに
SwiftUIでUIKitの機能を利用する
iPhoneのカメラ機能を例題とする
・UIKitのカメラ機能をSwiftUIで使用できるようにする
・そのためにはdelegateを使用する
整理しておくとこ
必要なもの
プロトコル
任せるクラス
任されるクラス
プロトコル
・条件・約束事
任せるクラス
・Bigカンパニーとイメージ
任されるクラス
・Bigカンパニーの下請け会社
全体のイメージ
![](https://sanjono-oheya.com/wp-content/uploads/2023/08/b0ea2aa28e8a35346782fe3a08fed454.png)
内容・詳細
構造体
![](https://sanjono-oheya.com/wp-content/uploads/2023/08/e64fa0cdb630357ae6d7b381f732954a.png)
構造体はSwiftUIでUIKitの機能を利用するための大枠となるとこです。この構造体が呼ばれることでdelegateパターンの処理がり、UIKitのカメラ機能を利用します。
・構造体がUIViewControllerRepresentableプロトコルに準拠することでUIKitのUIImagePickerControllerクラスを利用できるようになる
(上記はそうなんだくらいの理解で大丈夫です)
プロトコル
![](https://sanjono-oheya.com/wp-content/uploads/2023/08/549f1e4d6a44b28388f6c87e9254fbb6.png)
これが条件・約束事です。
詳しい内容は下記のようになっています。
@MainActor public protocol UIImagePickerControllerDelegate : NSObjectProtocol {
@available(iOS 2.0, *)
optional func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
@available(iOS 2.0, *)
optional func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
}
Bigカンパニー
![](https://sanjono-oheya.com/wp-content/uploads/2023/08/54fe8ed78c6e046d8e308ab1d0cbe5ca.png)
//UIImagePickerControllerクラスのインスタンスを生成
let myImagePickerController = UIImagePickerController()
BigカンパニーはUIImagePickerControllerクラスとなります。
Bigカンパニーの下請け
![](https://sanjono-oheya.com/wp-content/uploads/2023/08/dde6e3715e8a33104df731c9eae5579f.png)
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate
クラス CoordinatorがBigカンパニーの下請けとなります
まとめ
いかがでしょうか?
3役登場しましたね。
今一度、 下記の記事と比較してみてください
【SwiftUI】delegateを理解してUIKitの機能をSwiftUIで利用する
・SwiftUIを中心に学習している方のdelegateの理解
上記の内容とこのページを左右に開き(2画面など)比較しながら進めると理解がより深まると思います。
Bigカンパニーは
@MainActor open class UIImagePickerController : UINavigationController, NSCoding {
...
weak open var delegate: (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
...
}
上記のコードでわかるようにUIImagePickerControllerDelegateプロトコルが内容としてあります。
下請けさんは
CoordinatorクラスとしてUIImagePickerControllerDelegateプロトコルに準拠して、
func imagePickerController と func imagePickerControllerDidCancel 処理の内容を記載している状態です。
プロトコルは
上記で登場しているように UIImagePickerControllerDelegate です。
あとは実装ですが
//delegate設定
myImagePickerController.delegate = context.coordinator
最上図の実装と記載されている内容です。
呼び出されると実行される
あとは、SwiftUIの構造体が呼び出しされるとBigカンパニーがdelegateをとうして下請け会社に依頼する。依頼された下請けは、依頼された内容のイベントが発生したら処理をする。
このケース場合だと下請けが処理をする内容は、とある2つのイベントが発生したら構造体のブール値をfalseに変更。それに構造体が反応して、この構造体自体が終了する。という仕組みになっている。
最後に
いかがだったでしょうか。簡単ではありますが、これがSwiftUIでUIKitの機能を利用するです。
あくまでも、独学・自己流ですので何かご指摘があればご指導よろしくお願いします。
参考
藤 治仁・小林 加奈子・小林 由憲. SwiftUI 対応 たった2日でマスターできるiPhone アプリ開発集中講座 Xcode 13/iOS 15/Swift 5.5対応. ソシム株式会社、2021、p304-p335.
コメント