我試圖在 iPad 上的主詳細視圖中關閉詳細視圖(例如,如果該專案在主視圖中被洗掉并且需要空白右側)。
import SwiftUI
struct ContentView: View {
@State var selection: String?
var body: some View {
NavigationView {
List {
NavigationLink(tag: "item1", selection: $selection) {
DetailView(item: "Item 1", selection: $selection)
} label: {
Text("Item 1")
}
NavigationLink(tag: "item2", selection: $selection) {
DetailView(item: "Item 2", selection: $selection)
} label: {
Text("Item 2")
}
NavigationLink(tag: "item3", selection: $selection) {
DetailView(item: "Item 3", selection: $selection)
} label: {
Text("Item 3")
}
}
Text("Blank View")
}
}
}
struct DetailView: View {
let item: String
@Binding var selection: String?
@Environment(\.dismiss) var dismiss
var body: some View {
VStack {
Text("Detail for \(item)")
Button {
selection = nil
// dismiss()
} label: {
Text("Dismiss")
}
}
}
}
這是一個演示該問題的示例。按下關閉時,它會取消 iPhone 上關閉細節控制器的選擇。在 iPad 上,它將詳細視圖保留在那里,而不是回傳到空白視圖。
這是選擇專案之前的視圖。您可以在右側看到空白視圖。

選擇一個專案后,左側被選中,右側顯示相應的詳細視圖。

通過取消選擇(或使用環境關閉)關閉視圖后,左側的選擇會消失,但右側的細節視圖保持不變。這應該已經消失,空白視圖應該再次顯示。

uj5u.com熱心網友回復:
如果您愿意放棄splitView(在該側邊欄上有專案),您可以覆寫默認導航設定,使其表現得像在 iPhone 上一樣(使用堆疊導航視圖),然后關閉按鈕就可以正常作業。將此修飾符添加.navigationViewStyle(StackNavigationViewStyle())到NavigationView:
struct ContentView: View {
@State var selection: String?
var body: some View {
NavigationView {
List {
NavigationLink(tag: "item1", selection: $selection) {
DetailView(item: "Item 1", selection: $selection)
} label: {
Text("Item 1")
}
NavigationLink(tag: "item2", selection: $selection) {
DetailView(item: "Item 2", selection: $selection)
} label: {
Text("Item 2")
}
NavigationLink(tag: "item3", selection: $selection) {
DetailView(item: "Item 3", selection: $selection)
} label: {
Text("Item 3")
}
}
Text("Blank View")
}
.navigationViewStyle(StackNavigationViewStyle())
}
}


uj5u.com熱心網友回復:
我已經制定了一個可行的解決方案,但是它需要一些額外的邏輯。它需要某種檢查來查看資料是否存在,如果不存在則有條件地顯示主視圖或空白視圖。
這是DetailView我在問題中使用的示例的修改。如果選擇系結為零,則再次顯示空白視圖。
struct DetailView: View {
let item: String
@Binding var selection: String?
var body: some View {
if selection != nil {
VStack {
Text("Detail for \(item)")
Button {
selection = nil
} label: {
Text("Dismiss")
}
}
} else {
Text("Blank View")
}
}
}
在的情況下,NSManagedObject您可以檢查object.managedObjectContext != nil. 我決定把它作為一個擴展來使它更容易。
extension View {
@ViewBuilder
public func blankWithoutContext<BlankView>(_ object: NSManagedObject, blankView: () -> BlankView) -> some View where BlankView: View {
if object.managedObjectContext != nil {
self
} else {
blankView()
}
}
}
這是這樣使用的:
MyView()
.blankWithoutContext(object) {
Text("Blank View")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420736.html
標籤:
