はじめに
class ViewModel: NSObject, ObservableObject {
@Published var isShowAlert: Bool = false
/// 省略 ///
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Button(action: {
/// 省略 ///
}) {
/// 省略 ///
}
.alert(isPresented: Binding<Bool>) {
Alert(title: Text("確認"),
message: Text("これはテストです"),
dismissButton: .default(Text("OKOK")))
}
}
}
このようにViewModelで処理したPublished
な値をViewでBinding<型>
で扱いたい場面がありました。
問題点
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Button(action: {
/// 省略 ///
}) {
/// 省略 ///
}
.alert(isPresented: viewMode.$isShowAlert) {
Alert(title: Text("確認"),
message: Text("これはテストです"),
dismissButton: .default(Text("OKOK")))
}
}
しかしこのように書くと以下のようなエラーが発生します。
Cannot convert value of type 'Published<Bool>.Publisher' to expected argument type 'Binding<Bool>'
引数に指定するのはPublished<Bool>.Publisher
ではなく、Binding<Bool>
にしてとのこと。
対処法
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Button(action: {
/// 省略 ///
}) {
/// 省略 ///
}
.alert(isPresented: $viewModel.isShowAlert) {
Alert(title: Text("確認"),
message: Text("これはテストです"),
dismissButton: .default(Text("OK")))
}
}
このように書くことでBinding<Bool>
として扱えるようです。
参考にした記事
おわりに
今回はViewModelのPublishedな値をViewでBinding<型>で扱う方法について書きました。
ご覧いただきありがとうございました。
こうしたほうがいいや、ここはちょっと違うなど気になる箇所があった場合、ご教示いただけると幸いです。
2022年はiOS開発がどのように変化するのかが楽しみです!
お知らせ
現在、副業でiOSアプリ開発案件を募集しています!
全活動リンクをURLにまとめました。
https://linktr.ee/sasaki.ken