В приведенном ниже коде, следуя подсказкам Click to select entry
-> Click to populate linkedUuid
, верхний экран закрывается и возвращается к экрану Home
. Поскольку dismiss()
называется внутренним ShowAccounts
видом, я подумал, что только ShowAccounts
или SelectEntry
увольняют, оставляя Text("NavDest: Text-1")
в такте.
Код ведет себя не так, как я ожидаю. Что я здесь неправильно понимаю? Спасибо.
struct SO1_GAUsername: View {
let SRC = "SO1_GAUsername"
//=== Local ===
@State private var linkedUuid: String? = "<???>"
var body: some View {
Text(SRC)
HStack {
Text("LinkEntry")
Text(linkedUuid!)
.foregroundColor(.yellow)
}
LinkEntry(linkedUuid: $linkedUuid)
} // body
struct LinkEntry: View {
let SRC = "LinkEntry"
//=== Interface ===
@Binding var linkedUuid: String?
//=== Local ===
@Environment(\.presentationMode) @Binding private var presentationMode
@State private var showSelectEntry = false
var body: some View {
let _ = print("\(SRC): Called")
Button("Click to select entry") {
showSelectEntry = true
}
.foregroundColor(.blue)
.navigationDestination(isPresented: $showSelectEntry) {
Text("NavDest: Text-1")
SelectEntry(linkedUuid: $linkedUuid)
} // navDest
} // body
} // LinkEntry
struct SelectEntry: View {
let SRC = "SelectEntry"
//=== Interface ===
@Binding var linkedUuid: String?
//=== Local ===
@Environment(\.presentationMode) @Binding private var presentationMode
var body: some View {
let _ = print("\(SRC): Called")
ShowAccounts(linkedUuid: $linkedUuid)
} // body
} // SelectEntry
struct ShowAccounts: View {
let SRC = "ShowAccounts"
//=== Interface ===
@Binding var linkedUuid: String?
//=== Local ===
@Environment(\.presentationMode) @Binding private var presentationMode
var body: some View {
let _ = print("\(SRC): Called")
Button("\(SRC): Click to populate linkedUuid") {
let SRC = self.SRC + ".Button.click"
linkedUuid = "123xyz"
print("\(SRC): Dismissing")
presentationMode.dismiss()
}
.foregroundColor(.blue)
} // body
} // ShowAccounts
} // SO1_GAUsername
dismiss
, как известно, дает мне много непредсказуемых бесконечных циклов. Именно по этой причине я неохотно использую presentationMode
; последнее также не является полностью безопасным.
Согласно документу Apple , dismiss
можно использовать для:
То есть dismiss()
удаляет все содержащее представление (экран), а не только содержащееся представление. Таким образом, поведение, описанное в вопросе, является правильным.
избавьтесь от
Binding
наEnvironment
и переключитесь наdismiss
противpresentationMode
, похоже, вы следуете какому-то старому руководству