如何在 SwiftUI 中更新变量值?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中更新变量值?【英文标题】:how to update variable value in 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 视图的代码。 我已经更新了我的代码,请参考更完整的版本。 【参考方案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)
        
    

【讨论】:

感激不尽!这解决了我的问题。

以上是关于如何在 SwiftUI 中更新变量值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中获取更新的类变量值

如何更新数据流 ssis 中的变量值?

如何将变量值从循环A更新到另一个循环B - 在bash中

在C ++中更新const变量值

如何在没有设置器的情况下设置私有变量值?

如何使用 PHP 执行 sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 之类的东西来更新 laravel dotenv 文件中的变量值