Swiftui Binding 操作尝试每帧更新多次

2024-04-29

我在调试文本字段输入的问题时遇到问题。

信息:
-MacOs 蒙特利版本 12.0 Beta 21A5284e
-Xcode 13.0 beta 3 13A5192j
- 实体手机IOS 15.0 19A297e

问题说明: 当我尝试输入绑定到视图模型的文本字段时,出现错误: Swiftui 绑定操作尝试每帧更新多次。 例如,当您尝试将数据发送到 firebase 时,这将导致数据丢失。

您看到的数据:

Jhon
Do
119203940

您实际返回的数据:
Jho
D
119203

我使用的代码:

VIEW

import SwiftUI
import Firebase
import ImagePickerView

struct EditProfileView: View {
    var storageManager = StorageManager()
    @StateObject var UpdateProfileVM = UpdateProfileViewModel()
    
    @State private var image = UIImage()
    
    @State private var contentOffset = CGFloat(0)
    @State private var showImagePicker: Bool = false
    
    var body: some View {
        ZStack(alignment: .top) {
            TrackableScrollView(offsetChanged: { offsetPoint in
                contentOffset = offsetPoint.y
            }) {
                content
            }
            
            VisualEffectBlur(blurStyle: .systemMaterial)
                .opacity(contentOffset < -16 ? 1 : 0)
                .ignoresSafeArea()
                .frame(height: 0)
        }
        .background(Color("Background3").ignoresSafeArea(.all))
        .frame(maxHeight: .infinity, alignment: .top)
        .navigationTitle("Instellingen").font(.largeTitle)
    }
    
    var content: some View {
        
        VStack(alignment: .leading, spacing: 16) {
            Text("Pas je gegevens aan")
                .font(.subheadline)
            HStack {
                CustomGreenIcon(icon: "person.circle")
                    .onChange(of: image, perform: { value in
                        storageManager.uploadProfile(image: image)
                    })
                Text("Kies een foto")
                    .foregroundColor(Color.white)
                    .font(.subheadline)
            }
            .frame(maxWidth: .infinity, alignment: .leading)
            .padding(10)
            .background(Color("Accent"))
            .cornerRadius(20)
            .onTapGesture {
                self.showImagePicker.toggle()
            }
            
            HStack {
                CustomGreenIcon(icon: "character")
                TextField("Voornaam", text: $UpdateProfileVM.voornaam)
                    .font(.subheadline)
            }
            .padding(10)
            .background(Color("BackgroundFields"))
            .cornerRadius(20)
            HStack {
                CustomGreenIcon(icon: "textformat")
                TextField("Achternaam", text: $UpdateProfileVM.achternaam)
                    .font(.subheadline)
            }
            .padding(10)
            .background(Color("BackgroundFields"))
            .cornerRadius(20)
            
            HStack {
                CustomGreenIcon(icon: "iphone")
                TextField("Telefoonnummer", text: $UpdateProfileVM.telefoonnummer)
                    .font(.subheadline)
            }
            .padding(10)
            .background(Color("BackgroundFields"))
            .cornerRadius(20)
            
            GreenButton(text: "Bijwerken")
                .onTapGesture {
                    UpdateProfileVM.UpdateProfile {
                        print("Met succes gedaan")
                    }
                }
        }
        .frame(maxHeight: .infinity, alignment: .top)
        .padding()
        .sheet(isPresented: $showImagePicker) {
            ImagePickerView(sourceType: .photoLibrary) { image in
                self.image = image
            }
        }
    }
}

struct EditProfileView_Previews: PreviewProvider {
    static var previews: some View {
        EditProfileView()
            .environmentObject(UserStore())
//          .environment(\.colorScheme, .dark)
    }
}

视图模型

import SwiftUI
import Firebase

class UpdateProfileViewModel: ObservableObject {
    
    var voornaam: String = ""
    var achternaam: String = ""
    var telefoonnummer: String = ""
    var alertMessage: String = ""
    
    private var db = Firestore.firestore()
    
    func UpdateProfile(completion: @escaping () -> Void) {

        let userId = Auth.auth().currentUser?.uid ?? ""
        let docRef = db.collection("gebruikers").document(userId)
        
        docRef.updateData([
            "Voornaam": voornaam,
            "Achternaam": achternaam,
            "Telefoonnummer": telefoonnummer
        ]) { error in
            if let error = error {
                print("Error updaten profiel:  \(error)")
            } else {
                print("Profile updated")
            }
        }
        
        
    }
}

功能部分有点无关紧要,因为一旦您开始输入,消息就会开始显示在控制台中。 为简单起见,我只是添加了一个新视图,其中只有一个文本字段具有相同的结果。

每当我将函数与 @state 私有变量放在一起时,一切都很好。

我的期望
我希望将视图文本字段中填写的数据发送到 ViewModel 变量,以便我可以在函数中使用它来将数据发送到 firestore。

我是否可能将另一个视图中的值绑定到 ViewModel 上做错了什么?我找不到有关此主题的任何内容或错误消息。

希望有人能告诉我下一步该去哪里寻找或检查什么。

问候,


这可能是您想要做的:

class UpdateProfileViewModel: ObservableObject {
    
    @Published var voornaam: String = ""
    @Published var achternaam: String = ""
    @Published var telefoonnummer: String = ""
    @Published var alertMessage: String = ""
    
    private var db = Firestore.firestore()
    
    func UpdateProfile(completion: @escaping () -> Void) {

        let userId = Auth.auth().currentUser?.uid ?? ""
        let docRef = db.collection("gebruikers").document(userId)
        
        docRef.updateData([
            "Voornaam": voornaam,
            "Achternaam": achternaam,
            "Telefoonnummer": telefoonnummer
        ]) { error in
            if let error = error {
                print("Error updaten profiel:  \(error)")
            } else {
                print("Profile updated")
            }
        }

    }
}

struct FavoritesView: View {
    @StateObject private var viewModel = UpdateProfileViewModel()
    
    var body: some View {
        VStack {
            Text("Favorieten view")
            TextField("Voornaam", text: $viewModel.voornaam)
        }
        
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swiftui Binding 操作尝试每帧更新多次 的相关文章

随机推荐

  • 有没有办法在 .Net 中创建“自托管”网站? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 类似于 WCF 自托管 有没有办法创建一个在控制台应用程序中 自托管 的网站或dll 提出这个问题的方
  • 将 void* 作为函数调用而不声明函数指针

    我已经搜索过 但找不到任何结果 我的术语可能有问题 所以如果以前有人问过这个问题 请原谅我 我想知道是否有一种简单的方法可以调用void 作为 C 中的函数 无需首先声明函数指针 然后为函数指针分配地址 IE 假设要调用的函数是类型void
  • Laravel:如何模拟依赖注入类方法

    我正在使用GitHub API https github com KnpLabs php github api通过一个Laravel API 包装器 https github com GrahamCampbell Laravel GitHu
  • 什么时候使用弱引用? [复制]

    这个问题在这里已经有答案了 我了解什么是 Java WeakReference 我想知道的是它通常用于解决哪种具体问题 有没有包含它们的模式 WeakReference and SoftReference当您想保留某些东西以备再次需要时使用
  • 谷歌gson LinkedTreeMap类转换为myclass

    我知道这个问题以前已经被问过 由于我对java和android的新手技能 我一个多星期都无法解决这个问题 我和我的一位朋友正在开发一个 Android 项目 其中有一些类似的事情 最奇怪的部分是 只有当我从 Google Play 商店下载
  • .git/info/exclude 中的文件不起作用

    我已经放入了两个文件 git info exclude但我仍然可以看到他们git st 它们是配置文件 我不想提交更多 我把它们放在那里是因为 assume unchanged and skip worktree我无法结帐到另一家分行 如果
  • 对包含数字和字符串的数组进行排序

    我正在尝试对包含字符串 数字和数字作为字符串 例如 1 2 的数组进行排序 我想对这个数组进行排序 以便排序后的数组首先包含数字 然后包含包含数字的字符串 最后包含字符串 var arr 9 5 2 ab 3 1 to be sorted
  • 如何在控制器外部访问RequestContext?

    背景 我正在尝试将业务逻辑从控制器移至它们自己的服务中 控制器 public class AccountController Controller private readonly IAccountService accountServic
  • nUnit Assert.That(method,Throws.Exception) 不捕获异常

    有人可以告诉我为什么这个检查异常的单元测试失败了 显然我真正的测试是检查其他代码 但我使用 Int32 Parse 来显示问题 Test public void MyTest Assert That Int32 Parse abc Thro
  • 调试Windows服务

    Scenario 我有一个用 C 编写的 Windows 服务 我已经阅读了所有关于如何调试它的谷歌线程 但我仍然无法让它工作 我已经运行 PathTo NetFramework InstallUtil exe C MyService ex
  • 如何禁用Excel自动识别数字和文本

    我使用 Python 生成了 CSV 文件 但是当我在Excel中打开它时 如果可以转换 Excel会自动将字符串识别为数字 e g 33E105变成33 10 105 这实际上是一个ID 而不是一个数字 如何在打开 CSV 文件时在 Ex
  • 枚举列表中的列表

    我有一个约会 并记录了那天发生的事件 我想枚举显示日历的日期的事件列表 我还需要能够从列表中删除事件 def command add date event calendar if date not in calendar calendar
  • 当用户输入时将输入值转换为货币格式

    我无法将输入值转换为货币格式 我想在用户键入数字 5 000 00 125 000 00 时自动添加千位和小数分隔符 这是我的代码 input CurrencyInput on blur focus keyup function this
  • 检查仪器中的内存分配

    我已经使用泄漏工具清除了应用程序的泄漏 但我仍然注意到当我切换视图时 objectalloc 工具分配的对象数量和占用空间会增加 我特别看到大量 GeneralBlock 16 主要由基金会负责调用者 NSLogv and GeneralB
  • 为什么这个 require 从 rake 中失败但在显式运行时成功?

    帮助我理解为什么这个项目的测试在直接执行时运行 但在通过 rake 运行时不运行 通过 Rake TestTask 运行时出现错误 Execute test home myockey rvm rubies ruby 1 9 2 p136 b
  • PHPExcel 日期字段与源电子表格不匹配

    这是我的电子表格中的内容 12 04 2011 8 56 17 p m xls dateserial 40645 87242 这是我用来提取日期并转换为 PHP 中的日期字符串的代码 txn date xls sheet gt getCel
  • 服务中有很多依赖项

    我在服务层的应用程序中遇到依赖关系问题 我有以下课程
  • U-SQL 中的自动增量

    我正在尝试形成一个新表 其中包含现有表中唯一的 user id 是否可以添加自动递增U SQL 中的主键就像我们可以在 MySQL 中添加一样吗 详细说明 David 的答案 与 MySQL 不同 ADLA U SQL 是在横向扩展的无共享
  • MongoDB - WiredTiger 快照与锁定

    我不完全理解这两个功能在 WiredTiger MongoDB 程序中如何相互关联 1 WiredTiger 快照 2 数据锁定 如果使用WiredTiger引擎的每个读操作在读时都提供了数据库级别的 快照 以便创建一致性 ACID中的C
  • Swiftui Binding 操作尝试每帧更新多次

    我在调试文本字段输入的问题时遇到问题 信息 MacOs 蒙特利版本 12 0 Beta 21A5284e Xcode 13 0 beta 3 13A5192j 实体手机IOS 15 0 19A297e 问题说明 当我尝试输入绑定到视图模型的