【问题标题】:how to update variable value in SwiftUI?如何在 SwiftUI 中更新变量值?
【发布时间】:2021-10-13 10:40:22
【问题描述】:

似乎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)
}
            
        }
        
        
      
            }
            
            
        
        
        
        
    
    
    
    



【问题讨论】:

  • 您没有显示 Minimal Reproducible Example,但您可能使用了 2 个视图模型实例,其中一个不知道另一个在做什么。每次调用 LoginViewModel() 它都是一个单独的实例
  • 向我们展示您将LoginViewModel 传递给RegistrationPage 视图的代码。
  • 我已经更新了我的代码,请参考更完整的版本。

标签: ios swift mvvm swiftui


【解决方案1】:

您正在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)
        }
    }
}

【讨论】:

  • 感激不尽!这解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
相关资源
最近更新 更多