如何在 SwiftUI 中追加到数组?
Posted
技术标签:
【中文标题】如何在 SwiftUI 中追加到数组?【英文标题】:How to append to an array in SwiftUI? 【发布时间】:2019-08-30 15:36:42 【问题描述】:在 SwiftUI 中附加到数组时遇到问题。
我在 Xcode 11 beta 7 上使用更新的 ObservableObject
、EnvironmentObject
和 Published
语法在 watchOS 应用上。 WKHostingControlle
r 需要具体类型,所以通过 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) 中将新元素附加到数组