【发布时间】:2020-11-26 15:28:51
【问题描述】:
尝试编译以下代码时:
class LoginViewModel: ObservableObject, Identifiable {
@Published var mailAdress: String = ""
@Published var password: String = ""
@Published var showRegister = false
@Published var showPasswordReset = false
private let applicationStore: ApplicationStore
init(applicationStore: ApplicationStore) {
self.applicationStore = applicationStore
}
var passwordResetView: some View {
PasswordResetView(isPresented: $showPasswordReset) // This is where the error happens
}
}
PasswordResetView 如下所示:
struct PasswordResetView: View {
@Binding var isPresented: Bool
@State var mailAddress: String = ""
var body: some View {
EmptyView()
}
}
}
我得到错误编译错误
Cannot convert value of type 'Published<Bool>.Publisher' to expected argument type 'Binding<Bool>'
如果我在 LoginViewModel 类之外使用发布的变量,它就可以正常工作:
struct LoginView: View {
@ObservedObject var viewModel: LoginViewModel
init(viewModel: LoginViewModel) {
self.viewModel = viewModel
}
var body: some View {
PasswordResetView(isPresented: self.$viewModel.showPasswordReset)
}
}
有什么建议我在这里做错了吗?我有机会从所属类内部将已发布的变量作为绑定传递吗?
谢谢!
【问题讨论】:
-
投影值(以 $ 开头的东西)在不同的上下文中可能不同。如果第一种情况
@Published生成发布者预计值,则第二种情况下的绑定预计值由@ObservedObject生成。问题是你想做什么,为什么要放置 View Insider 视图模型? -
我遵循 Ray Wenderlich Sitze (raywenderlich.com/4161005-mvvm-with-combine-tutorial-for-ios) 上描述的 MVVM 原则。他们将所有路由逻辑放在视图的视图模型中(包括视图的实例化和配置+它们的模型)。这基本上就是我在这里想要做的。
-
最好遵循 SwiftUI 原则,MVVM 并不真正适合已经解决所有问题的 SwiftUI。