如何在 SwiftUI 中追加到数组?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中追加到数组?【英文标题】:How to append to an array in SwiftUI? 【发布时间】:2019-08-30 15:36:42 【问题描述】:

在 SwiftUI 中附加到数组时遇到问题。

我在 Xcode 11 beta 7 上使用更新的 ObservableObjectEnvironmentObjectPublished 语法在 watchOS 应用上WKHostingController 需要具体类型,所以通过 ContentView().environmentObject(subject) is not possible

这一行会使应用程序崩溃:

self.subjectData.store.append(Subject(name: self.addedSubject, isFavorite: false)) 

有什么想法吗?

struct Subject: Codable, Identifiable 
    var id: UUID = UUID()
    var name: String
    var isFavorite: Bool


class SubjectDataEnv: ObservableObject 
    @Published var store = [
        Subject(name: "Physics", isFavorite: true),
        Subject(name: "Science", isFavorite: false)
    ]
    @Published var selectedSubject = Subject(name: "Subject 1", isFavorite: false)


class HostingController: WKHostingController<ContentView> 
    override var body: ContentView 
        return ContentView()
    


struct ContentView: View 
    @State var subjectData = SubjectDataEnv()

    var body: some View 
        SubjectView().environmentObject(subjectData)
    


struct SubjectView: View 
    @EnvironmentObject var subjectData: SubjectDataEnv
    var body: some View 
        List 
            ForEach(subjectData.store)  subject in
                NavigationLink(destination: DurationView()
                    .environmentObject(self.subjectData)
                )
            
            NavigationLink(destination: AddSubjectView()
                .environmentObject(self.subjectData)
            ) 
                Text("+")
            
        
    


struct AddSubjectView: View   
    @EnvironmentObject var subjectData: SubjectDataEnv
    @State var addedSubject: String = "subject"
    var body: some View 
        VStack(alignment: .leading, spacing: 0) 
            TextField("Add your subject", text: $addedSubject)
            Button(action: 
                self.subjectData.store.append(Subject(name: self.addedSubject, isFavorite: false))   // crashes the app
            ) 
                Text("Done")
            
        
    

【问题讨论】:

能否请您发布您所面临的错误信息? 我不太了解调试器,但这就是我所看到的。 SwiftUI`SwiftUI.UIKitNavigationBridge.(push in F345616596EA75D1F4200D7666E5E588)(: SwiftUI.NavigationDestinationContent, 到: __C.UINavigationController, 动画: Swift.Bool) -> (): 【参考方案1】:

有两种可能的方法:

    使用 AnyView
class HostingController: WKHostingController<AnyView> 
    override var body: AnyView 
        return AnyView(AddSubjectView().environmentObject(SubjectDataEnv()))
    

这是输出(我在按钮中附加了print):

print(self.subjectData.store)
Subject(id: 2F3745EE-752B-4C8C-8A4F-8C21E73B315C, name: "Physics", isFavorite: true)
Subject(id: 5A9CF711-F6BE-4854-8F58-35FD004B2419, name: "Science", isFavorite: false)
Subject(id: E2F6A25E-3BC0-4D17-9AEF-07286533D475, name: "??", isFavorite: false)
Subject(id: 62FA7D12-A3D5-4381-8232-F48268B433F1, name: "☺️", isFavorite: false)

请注意那里的新 ??☺️ 主题。

    在“父视图”中注入@EnvironmenObject
class HostingController: WKHostingController<ContentView> 
    override var body: ContentView 
        return ContentView()
    

struct ContentView: View 
    var body: some View 
        return AddSubjectView().environmentObject(SubjectDataEnv())
    

后者将产生相同的结果。

【讨论】:

鉴于 WKHostingController 期望具体类型,我无法执行以下 ContentView().environmentObject(UserData()) (回复:***.com/questions/57559200/…),因此我正在尝试解决该答案。 @Env 适用于 iPhone 应用程序,所以我没有问题。 知道了。我更新了我的答案,请再看看。 我添加了更多代码。缩短的版本也适用于我。嗯。它与 WK/Env 元素无关。我通过“父视图”方法注入@EnvironmentObject - 现在已在上面更新。谢谢。

以上是关于如何在 SwiftUI 中追加到数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Userdefaults (SwiftUI) 中将新元素附加到数组

如何在js中把对象object追加到数组中?

如何使用 SwiftUI 将数组绑定到列表

SwiftUI - 如何修改数组中的文本字段

如何使用 .reversed() 处理 SwiftUI 列表数组的 .onDelete

如何将 SwiftUI 视图绑定到数组中元素的属性