如何解决在父swiftui视图中,如何知道内部视图viewmodel void方法中的状态何时发生变化?
鉴于AuthenticationView swiftui结构包含一个UserLoginView。 UserLoginView具有用于处理登录按钮操作的UserLoginViewModel类。
在AuthenticationView中,我想知道内部UserLoginView中变量的值何时更改(如果AuthenticationView中的tutorialScreenIsShowable为true,则NavigationLink导航至下一张幻灯片)。
struct AuthenticationView: View {
@State private var tutorialScreenIsShowable = false
var body: some View {
NavigationView {
ZStack {
NavigationLink(destination: TutorialView(),isActive: $tutorialScreenIsShowable) {
EmptyView()
}
UserLoginView(tutorialScreenIsShowable: self.$tutorialScreenIsShowable)
}
}
}
}
,
struct UserLoginView: View {
@Binding var tutorialScreenIsShowable: Bool
@ObservedObject var userLoginViewModel = UserLoginViewModel()
var body: some View {
Button(action: {
self.userLoginViewModel.loginButtonAction() // it not works but I need this way
// self.tutorialScreenIsShowable = self.userLoginViewModel.loginButtonActionWithReturn() // it works,but its not good in this case
}) {
Text("Log in")
}
}
}
,
class UserLoginViewModel: NSObject,ObservableObject {
@Published var tutorialScreenIsShowable = false
func loginButtonAction() {
self.tutorialScreenIsShowable = true
}
func loginButtonActionWithReturn() -> Bool {
return true
}
}
据我所知,该函数是否具有可以正常工作的返回值,但是在这种情况下,运行的委托方法可以处理该变量。
我想尽可能避免使用@EnvironmentObject,希望有其他解决方案。
您能帮我吗?
编辑:我简化了示例。并在此处上传了示例项目:api
解决方法
此行为的起源于NavigationView
,并且在更新过程中多次重新创建自己的内容。
这是一个可能的解决方案-进行一些重新设计和所有权更改。
通过Xcode 11.4 / iOS 13.4测试
struct AuthenticationView: View {
// keep model here to avoid recreation inside navigation view
@ObservedObject var userLoginViewModel = UserLoginViewModel()
var body: some View {
NavigationView {
ZStack {
// use binding directly in view model
NavigationLink(destination: Text("TutorialView"),isActive: $userLoginViewModel.tutorialScreenIsShowable) {
EmptyView()
}
UserLoginView(userLoginViewModel: userLoginViewModel)
}
}
}
}
struct UserLoginView: View {
@ObservedObject var userLoginViewModel: UserLoginViewModel
var body: some View {
Button(action: {
self.userLoginViewModel.loginButtonAction()
}) {
Text("Log in")
}
}
}
class UserLoginViewModel: NSObject,ObservableObject {
@Published var tutorialScreenIsShowable = false
func loginButtonAction() {
self.tutorialScreenIsShowable = true
}
func loginButtonActionWithReturn() -> Bool {
return true
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。