我试图防止当用户点击弹出窗口外部时弹出窗口被关闭。我似乎对此还有其他问题/答案,他们似乎都建议使用 modalInPopover 来查看视图。我已经按照我所看到的建议在 viewDidAppear 中完成了此操作。我有文本字段以及根据下拉菜单中的选择填充标签的按钮。在输入任何信息之前,它工作正常,并且在点击外部时不会关闭弹出窗口。当在文本字段中输入文本时,它也可以正常工作。但是,一旦我点击其中一个按钮后从下拉列表中进行选择,弹出窗口就会在触摸其外部后关闭。
对于为什么会出现这种情况,还有其他建议吗?这可能与在文本字段上调用 resignFirstResponder 有关吗?
在 swift 3、ios 10 中
实现 UIPopoverPresentationControllerDelegate 后,以下函数似乎可以解决问题。
func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
return false
}
如果有人仍在寻找解决方案,我希望这会有所帮助。
您可以实施
UIPopoverControllerDelegate
:
func popoverControllerShouldDismissPopover(popoverController: UIPopoverController) -> Bool {
//return true when you need
return false
}
这在 iOS 9.0 中已弃用,但如果您有支持 iOS 8 的项目,则必须使用它。
请告诉我它是否适合您
显示时,点击弹出窗口外部会导致弹出窗口自动关闭。要允许用户与指定视图交互而不关闭弹出窗口,您可以将一个或多个视图分配给 passthroughViews 属性。在弹出窗口内点击不会自动导致弹出窗口被关闭。您的视图和视图控制器代码必须显式处理弹出窗口内的操作和事件,并根据需要调用miss(animated:)方法。
更新: 使用
UIPopoverPresentationControllerDelegate
func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
return false
}
对于 SwiftUI iOS 15.0+、iPadOS 15.0+、Mac Catalyst 15.0+、macOS 12.0+、tvOS 15.0+、visionOS 1.0+、watchOS 8.0+,有新的 API 可用
interactiveDismissDisabled(_:)
,默认情况下采用 true
参数。
使用示例:
struct ContentView: View {
@State private var isPresented = false
var body: some View {
Button("Show popover) {
isPresented = true
}
.popover(isPresented: $isPresented) {
Text("Demo")
.interactiveDismissDisabled()
}
}
}
这同样适用于板材和检验员。 只需要小心地将
.interactiveDismissDisabled()
应用于 Popover 视图本身,而不是在 .popover
视图修饰符之后。
为了以编程方式关闭 Popover,请使用 @Environment(\.dismiss)