首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新SwiftUI中的变量值?

如何更新SwiftUI中的变量值?
EN

Stack Overflow用户
提问于 2021-10-13 10:40:22
回答 1查看 788关注 0票数 0

var usernamevar password似乎没有随着我在textfield中的输入而更新。既然我使用$来绑定,那么有什么问题呢?

观点:

代码语言:javascript
复制
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()
        }
    }
    }

视图模型

代码语言:javascript
复制
class LoginViewModel: ObservableObject {
    
    @Published var username: String = ""
    @Published var password: String = ""
    
}

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

代码语言:javascript
复制
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)
}
            
        }
        
        
      
            }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-13 17:21:23

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

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

代码语言:javascript
复制
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)
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69554021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档