我目前正在使用 SwiftUI 编写一个项目,列表中的每个按钮都呈现一个工作表。如果我使用关闭按钮关闭并选择列表中的另一个按钮,则工作表将不会出现问题。
但是,如果我通过向下滑动来关闭并尝试快速选择列表中的另一个按钮,则除非再次点击该按钮,否则该工作表不会显示。
我对此做了一些测试,我发现当我在关闭工作表后立即点击按钮时,即使工作表未显示在屏幕上,
isPresented
仍然为真。
我的结论是,使用关闭按钮时,
isPresented
会立即设置为 false,但是使用滑动手势关闭在更新 isPresented
时会出现明显的延迟。如何消除滑动手势的延迟?
我也尝试使用
sheet(item: )
,但如果我快速关闭并按下按钮,某些按钮往往不会显示表格。
下面附有示例代码。首先,显示工作表,使用滑动手势将其关闭,然后快速选择列表中的另一个按钮(或同一按钮)。该表不应出现。
// Comment out the ContentView that you don't want to present
struct SheetItem: Identifiable {
let id: UUID = UUID()
let name: String
}
struct ContentView: View {
let items = [
SheetItem(name: "John"),
SheetItem(name: "Dylan"),
SheetItem(name: "Dave")
]
@State private var isPresented = false
@State private var selectedItem: SheetItem?
var body: some View {
NavigationView {
List {
Section("Uses isPresented for the sheet") {
ForEach(items, id: \.id) { item in
Button(item.name) {
// This shows the sheet presentation state on button press
// print(isPresented)
selectedItem = item
isPresented.toggle()
}
}
}
}
.navigationTitle("Results")
}
.sheet(isPresented: $isPresented) {
if let item = selectedItem {
SheetView(item: item)
} else {
Text("Item not selected?")
}
}
}
}
struct ContentView: View {
let items = [
SheetItem(name: "John"),
SheetItem(name: "Dylan"),
SheetItem(name: "Dave")
]
@State private var isPresented = false
@State private var selectedItem: SheetItem?
var body: some View {
NavigationView {
List {
Section("Uses isPresented for the sheet") {
ForEach(items, id: \.id) { item in
Button(item.name) {
// This shows the sheet presentation state on button press
// print(selectedItem)
selectedItem = item
}
}
}
}
.navigationTitle("Results")
}
.sheet(item: $selectedItem) { item in
SheetView(item: item)
}
}
}
struct SheetView: View {
@Environment(\.dismiss) var dismiss
var item: SheetItem
var body: some View {
VStack {
Text("Hello, \(item.name)")
Button("Dismiss") {
dismiss()
}
}
}
}
我发现的唯一解决方法是在日期选择器被关闭后包装您想要呈现的内容,如下所示
// Adjust the delay as needed (I've used 0.25 secs with success)
DispatchQueue.main.asyncAfter(deadline: .now() + delayInSeconds) {
showingConfirmationDialog = true
}