【发布时间】:2021-04-14 00:44:19
【问题描述】:
我有 4 个视图。
- 祖父母
- 父母
- 孩子
- 编辑视图
Grandparent 有一个指向 Parent 的导航链接,Parent 有一个指向 Child 的导航链接。 Child 有一个按钮,该按钮通过 Parent 中的绑定和 Child 中的绑定从 Grandparent 初始化 @State 变量位置(类)。同一个按钮还更新了来自祖父的@State 变量 showEditView(再次通过绑定),它显示了 EditView。
目前有 11 行被注释掉。如果它们被注释掉,当我点击子视图中的按钮时,应用程序会抛出“致命错误:意外发现 nil ...”错误。如果任一部分未注释,则该按钮不会引发错误。
如果我将绑定位置传递给 EditView,而不是像我当前正在做的那样将属性本身传递给它,它也可以工作,然后将其包装为 @ObservedObject。
我不明白这里发生了什么。我唯一能做到的是,当它工作时,SwiftUI 正在更新 location 属性,因为它在正文中使用。如果是这种情况,这似乎表明我每次想要以这种方式传递属性时都必须包含该属性的隐藏文本视图。
祖父母
import SwiftUI
struct Grandparent: View {
@State var location: Location!
@State var showEditView: Bool = false
var body: some View {
NavigationView {
VStack{
NavigationLink(
destination: Parent(location: $location, showEditView: $showEditView)) {
Text("Navigate")
}
// // section 1
// if location != nil {
// Text(location.name)
// } else {
// Text("No location yet")
// }
}
// // section 2
// .navigationBarItems(trailing:
// Button("Edit"){
// showEditView = true
// }
// .disabled(location == nil)
// )
}
.padding()
.sheet(isPresented: $showEditView) {
EditView(placemark: location, dismiss: { showEditView = false })
}
}
}
父母
import SwiftUI
struct Parent: View {
@Binding var location: Location!
@Binding var showEditView: Bool
var body: some View {
NavigationLink(
destination: Child(location: $location, showEditView: $showEditView),
label: {
Text("Child")
})
}
}
孩子
import SwiftUI
struct Child: View {
@Binding var location: Location!
@Binding var showEditView: Bool
var body: some View {
Button("Make location") {
location = Location(name: "Lebanon")
showEditView = true
}
}
}
编辑视图
import SwiftUI
struct EditView: View {
@ObservedObject var placemark: Location
var dismiss: () -> Void
var body: some View {
NavigationView {
Text(placemark.name)
.navigationTitle("Edit place")
.navigationBarItems(trailing: Button("Done") { dismiss() })
}
}
}
位置
import Foundation
class Location: ObservableObject {
init(name: String) {
self.name = name
}
@Published var name: String
}
【问题讨论】:
-
你有没有试过不使用强制换行可选
@State var location: Location? -
您可能还想要
@StateObject而不是@State....而且不初始化它也没有意义