防止敲击外部时弹出窗口消失(Swift)

问题描述 投票:0回答:5

我试图防止当用户点击弹出窗口外部时弹出窗口被关闭。我似乎对此还有其他问题/答案,他们似乎都建议使用 modalInPopover 来查看视图。我已经按照我所看到的建议在 viewDidAppear 中完成了此操作。我有文本字段以及根据下拉菜单中的选择填充标签的按钮。在输入任何信息之前,它工作正常,并且在点击外部时不会关闭弹出窗口。当在文本字段中输入文本时,它也可以正常工作。但是,一旦我点击其中一个按钮后从下拉列表中进行选择,弹出窗口就会在触摸其外部后关闭。

对于为什么会出现这种情况,还有其他建议吗?这可能与在文本字段上调用 resignFirstResponder 有关吗?

ios swift popover
5个回答
15
投票

在 swift 3、ios 10 中

实现 UIPopoverPresentationControllerDelegate 后,以下函数似乎可以解决问题。

func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
    return false
}

如果有人仍在寻找解决方案,我希望这会有所帮助。


1
投票

您可以实施

UIPopoverControllerDelegate

func popoverControllerShouldDismissPopover(popoverController: UIPopoverController) -> Bool {
    //return true when you need
    return false
}

这在 iOS 9.0 中已弃用,但如果您有支持 iOS 8 的项目,则必须使用它。

请告诉我它是否适合您


1
投票

显示时,点击弹出窗口外部会导致弹出窗口自动关闭。要允许用户与指定视图交互而不关闭弹出窗口,您可以将一个或多个视图分配给 passthroughViews 属性。在弹出窗口内点击不会自动导致弹出窗口被关闭。您的视图和视图控制器代码必须显式处理弹出窗口内的操作和事件,并根据需要调用miss(animated:)方法。

文档


0
投票

更新: 使用

UIPopoverPresentationControllerDelegate

func popoverPresentationControllerShouldDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) -> Bool {
        return false
    }

0
投票

对于 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)

© www.soinside.com 2019 - 2024. All rights reserved.