如何在 SwiftUI 中更新变量值?

how to update variable value in SwiftUI?

var usernamevar password 似乎没有随着我在文本字段中的输入而更新。由于我使用 $ 绑定,可能是什么问题 ?

观点:


import SwiftUI


struct RegistrationPage: View {
    
    @ObservedObject var login : LoginViewModel

  
    var body: some View {
                
    VStack{
        HStack{
        Text("username")
            TextField( "username",
                       text:  $login.username
                       )
                .autocapitalization(.none)
            
        }
            
        
            .padding()
            
        HStack{
        Text("password")
        TextField( "password",
                   text:  $login.password)
                .autocapitalization(.none)

        }
            .padding()
            
            
            
        Text("click to submit registration")
                .onTapGesture {
                    Register.insertData()
                    }
        .font(.body)
        .padding()
        }
    }
    }

视图模型


class LoginViewModel: ObservableObject {
    
    @Published var username: String = ""
    @Published var password: String = ""
    
}



下面的模型(实际上服务器数据库只收到空白字符串,我认为这是 var usernamevar password 的初始值,同样的问题..)



import Foundation
import LeanCloud //the BaaS service whose SDK I used in the following 
import SwiftUI


    
    struct Register {
        


        static func insertData() {
        
            do {
                
                @ObservedObject var login = LoginViewModel()


    
    let register = LCObject(className: "Register")

            
                try register.set("username", value: login.username)
                try register.set("password", value: login.password)
                

                
    _ = register.save { result in
        
        switch result {
            
        case .success:
            
            break
            
        case .failure(error: let error):

            print(error)
        }
    }
} catch {
    print(error)
}
            
        }
        
        
      
            }
            
            
        
        
        
        
    
    
    
    



您正在 insertData 中创建 LoginViewModel 新实例 。因为它是一个新的且不同于您视图中使用的实例,所以它不会共享任何数据。

要解决这个问题,您可以将相同实例的引用传递给函数。


struct RegistrationPage: View {
    
    @ObservedObject var login : LoginViewModel
    
    var body: some View {
        
        TextField( "username",
                   text:  $login.username
        )
            .autocapitalization(.none)
        TextField( "password",
                   text:  $login.password)
            .autocapitalization(.none)
        
        Text("click to submit registration")
            .onTapGesture {
                Register.insertData(withViewModel: login)
            }
            .font(.body)
            .padding()
    }
}


struct Register  {
    static func insertData(withViewModel login : LoginViewModel) {
        do {
            let register = LCObject(className: "Register")
            
            try register.set("username", value: login.username)
            try register.set("password", value: login.password)
            
            _ = register.save { result in
                
                switch result {
                case .success:
                    break
                case .failure(error: let error):
                    print(error)
                }
            }
        } catch {
            print(error)
        }
    }
}