【问题标题】:How to append to an array in SwiftUI?如何在 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) -> ():

标签: swift apple-watch environment swiftui watchos


【解决方案1】:

有两种可能的方法:

  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)

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

  1. 在“父视图”中注入@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()) (回复:stackoverflow.com/questions/57559200/…),因此我正在尝试解决该答案。 @Env 适用于 iPhone 应用程序,所以我没有问题。
  • 知道了。我更新了我的答案,请再看看。
  • 我添加了更多代码。缩短的版本也适用于我。嗯。它与 WK/Env 元素无关。我通过“父视图”方法注入@EnvironmentObject - 现在已在上面更新。谢谢。
猜你喜欢
  • 2021-08-20
  • 2016-03-04
  • 1970-01-01
  • 2021-10-02
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多