【发布时间】:2021-01-25 04:59:27
【问题描述】:
我正在使用 MVVM 设置登录页面逻辑,但在从 ViewModel 调用该函数后,我无法弄清楚如何修改用户登录状态。
登录查看
struct LoginView: View {
@ObservedObject var user: User
@ObservedObject var viewModel = LoginViewModel()
@State var inputUser: String = ""
@State var inputPass: String = ""
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Group {
Text("Login")
CustomTextField(placeHolder: "Username", value: $viewModel.user, secure: false)
CustomTextField(placeHolder: "Password", value: $viewModel.pass, secure: true)
Button(action: {
self.viewModel.login()
// After this login function completes and if return result success
// How do I pass data / callback after login?
// How to check if login success then set token or login failed
self.user.tokenIsActive = true
}) {
Text("Sign In")
}
}
}
}
}
}
登录视图模型
class LoginViewModel: ObservableObject, LoginService {
var apiSession: APIService
@Published var user = ""
@Published var pass = ""
@Published var accessToken: String?
var cancellables = Set<AnyCancellable>()
init(apiSession: APIService = APISession()) {
self.apiSession = apiSession
}
func login() {
let cancellable = self.loginUser(user: user, pass: pass)
.sink(receiveCompletion: { result in
switch result {
case .failure(let error):
print("Handle error: \(error)")
case .finished:
break
}
}) { (result) in
self.accessToken = result.accessToken
UserDefaults.standard.set(self.accessToken, forKey: "accessToken")
}
cancellables.insert(cancellable)
}
}
用户
所以我将用户会话存储在 User 类中
class User: ObservableObject {
@Published var tokenIsActive = false;
}
如何从视图模型中的登录功能传递数据并检查登录是否成功并设置用户令牌?提前谢谢你。
【问题讨论】:
-
为什么你的视图中有 User 作为属性,不应该通过视图模型来访问吗?