为什么 observedObject 在 SwiftUI 中无法使用 if 条件?

问题描述 投票:0回答:2

我有一个非常简单的视图,它有一个按钮,点击按钮我正在做一些 API 调用的事情。 API 调用后,我想在“if”块内采取一些操作,但它在第一次点击时不工作,但当我在按钮上点击两次或三次时它正在工作。我不知道为什么会这样。

查看

import SwiftUI

struct OtpView: View {
    @ObservedObject var otpViewModel = OTPViewModel()
    //@EnvironmentObject var session: SessionManager
    var body: some View {
        
        ZStack {
            Button {
                otpViewModel.fetchData()
                if otpViewModel.isLoggedIn {
                    // some action
                    print("some action")
                 }
                
            } label: {
                Text("SUBMIT")
                    
            }
        }
        
        .navigationTitle("OTP") 
        
        
    }
}

struct OtpView_Previews: PreviewProvider {
    static var previews: some View {
        OtpView()
    }
}

// 视图模型

import SwiftUI
import Foundation

class OTPViewModel: ObservableObject {
    
    @Published var isLoggedIn: Bool = false
    
    func fetchData() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 4, execute: {
            self.isLoggedIn = true
        })
    }
    
    
}

关于“isLoggedIn”变量值的变化我想采取一些行动

ios swift swiftui xcode8
2个回答
0
投票

因为

fetchData
在四秒后切换
isLoggedIn
,第一次按下按钮时总是
false

一个简单的解决方案是删除

if
表达式

if otpViewModel.isLoggedIn {
    // some action
    print("some action")
 }

并将

onChange
修饰符添加到
ZStack

ZStack {
    // ...
}
.onChange(of: otpViewModel.isLoggedIn) { isLoggedIn in
    if isLoggedIn { 
        // some action
        print("some action") 
    }
}

0
投票

你的意思是你想要在返回结果时在按钮中运行额外的代码。如前所述,您正在同步上下文中执行异步任务。一旦 otpViewModel.fetchData() 被调度运行,按钮将立即运行 if 语句(可能在后台更新到 isLoggedIn 之前)。

理想情况下,您需要运行的任何进一步逻辑都可以在异步函数返回并根据需要更新@Published变量后在对象的函数中完成。

然后视图将根据需要响应 @Published 变量更新。

© www.soinside.com 2019 - 2024. All rights reserved.