使用按钮添加用户输入的数据

Posted

技术标签:

【中文标题】使用按钮添加用户输入的数据【英文标题】:Using a button to add data that a user inputted 【发布时间】:2020-09-26 15:36:41 【问题描述】:

好的,所以我已经为此工作了好几天,但没有找到任何有意义的答案。我在 SwiftUI 中有一个表单,使用 @ObservedObject 从结构中提取变量。在该表单中,我有各种用户可以与之交互的文本字段和选择器。但是,我无法弄清楚如何让我的“添加”按钮将该数据实际添加到应用程序中的任何其他视图中。我按照 WWDC20 的三明治教程进行了重大更改,因此有一个带有“testData”的快速文件,基本上我正在尝试获取它,以便按钮使用用户输入来附加 testData 并显示它而不是什么。

struct Horse: Identifiable 
    var id = UUID()
    var name: String
    var gender: String
    var breed: String
    var type: String
    var scale: String
    var brand: String
    var finish: String
    var specialty: String
    
    
    var imageName: String  return name 
    var thumbnailName: String  return name + "Thumb" 


let testData = [
    Horse(name: "Van Gogh", gender: "Stallion", breed: "Unknown", type: "Customized", scale: "Stablemate", brand: "Peter Stone", finish: "Gloss", specialty: "OOAK")
]

所以这就是我用来建立 testData 以及应该包含在其中的参数。

func addANewHorse() 
    withAnimation 
        testStore.horses.append(Horse(name: "\(horseDetails.horseName)", gender: "\(horseDetails.selectedGender.rawValue)", breed: "\(horseDetails.horseBreed)", type: "\(horseDetails.type.rawValue)", scale: "\(horseDetails.scale.rawValue)", brand: "\(horseDetails.brand.rawValue)", finish: "\(horseDetails.finish.rawValue)", specialty: "\(horseDetails.specialty.rawValue)"))
    


Button("Add", action: 
    addANewHorse();
    self.presentationMode.wrappedValue.dismiss()
)

这就是我用来尝试附加 testData 以使用用户输入进行更新的方法。我知道这有点不稳定,但有人有什么建议吗? - -编辑 - - 我的主应用程序文件如下所示...

@main

struct Pferd_HerdApp: 应用程序

@StateObject private var store = HorseStore()
@StateObject private var horseDetails = HorseDetails()

var body: some Scene 
    WindowGroup 
        ContentView(store: store, horseDetails: HorseDetails())
    

我的马店课是这样的……

class HorseStore: ObservableObject 
@Published var horses: [Horse]

init(horses: [Horse] = []) 
    self.horses = horses

让 testStore = HorseStore(horses: testData)

另外,“HorseDetails”是我试图从中提取数据以附加 testData 的 observableobject,所以这里是它的代码

class HorseDetails: ObservableObject 
@Published var horseName = ""
@Published var selectedGender = Gender.allCases[0]
@Published var horseBreed = ""
@Published var purchaseDate = Date()
@Published var winCount = ""
@Published var notes = ""
@Published var brand = Brands.allCases[0]
@Published var type = Type.allCases[0]
@Published var scale = Scale.allCases[0]
@Published var finish = Finish.allCases[0]
@Published var specialRun = false
@Published var specialty = Specialty.allCases[0]

var horseDetails = HorseDetails()

我将 testData 的 let 更改为变量

【问题讨论】:

让变量定义常量,它只在第一次初始化,所以定义你的列表为@State var list[Horse] = [] 【参考方案1】:

由于您的问题遗漏了很多代码,我将做出一些假设。我假设您的表单(您可以在其中添加数据的按钮)和用于显示数据的视图位于两个不同的视图中。尽管在上面的代码中使用了您的视图模型 (testStore) 的实例,但您尚未在代码中包含您的视图模型。您需要确保在视图层次结构的根部的某个位置,您创建了视图模型的实例(我假设它称为 TestStoreViewModel)并将其作为环境对象传递给您的子视图。例如,你应该是这样的

@main
struct YourApp: App 
    let testStoreViewModel = TestStoreViewModel()
    var body: some Scene 
        WindowGroup 
            ContentView().environmentObject(testStoreViewModel)
        
    

在您需要使用来自 TestStoreViewModel 的数据的所有视图中,您应该像这样声明它

@EnvironmentObject var testStore:TestStoreViewModel

使用环境对象意味着您的可观察对象会自动在所有使用环境对象的视图中同步。上面代码中的所有其他内容都应该可以在使用 EnvironmentObjects 和单一事实来源的情况下正常工作。有关环境对象的更多信息,您可以查看this article,我认为它非常适合在 swiftui 中解释环境对象。还需要注意的是,在那篇文章中,它提到了 SceneDelegte 的使用,并且 ContentView 被包裹在 UIHostingController 周围。那被我上面展示的第一段代码所取代。

【讨论】:

确保您的 HourseDetails 类符合 ObservableObject 并将 HourseDeetails 的实例作为 EnvironmentObject 通过环境传递,如我上面的回答所示。 如果您不想使用该环境,您可以使用本文中看到的 Observable Object hackingwithswift.com/quick-start/swiftui/… 我编辑了原始帖子以添加更多代码,因此更有意义。我的 HorseDetails 类是一个可观察对象,我只是想弄清楚如何将它放在主应用程序文件中,以便跨视图保存这些变量和用户输入 只需将它传递到这样的环境中 ContentView(store: store).envionmentObject(horseDetails) 并在您的 ContentView 或嵌入在 ContentView 中的任何视图中,您可以访问您传递的 hourseDetails 实例进入这样的环境@EnvironmentObject var horseDetails:HorseDetails

以上是关于使用按钮添加用户输入的数据的主要内容,如果未能解决你的问题,请参考以下文章

单击添加新按钮并使用php-pdo将数据插入数据库时​​如何生成2个新输入字段[关闭]

微信小程序云开发— “增删改查综合案例(用户输入数据并动态添加到数据库)”

Javascript - 通过用户输入使用排序按钮创建的列表

在 Safari 10 中隐藏自动添加的输入(用户)按钮(?)

Android将图像添加到数据库

当用户单击按钮时,将文本字符串添加到输入字段中(在光标位置)