返回

SwiftUI中无法关闭键盘或PKToolPicker?如何强制注销第一响应器

IOS

SwiftUI 中强制注销第一响应器的终结之路

问题

在使用 SwiftUI 中的 QLPreviewController 显示 PDF 文件时,我遇到了一个令人头疼的问题。当我想使用 PencilKit 绘图时,无法关闭键盘,导致交互体验不佳。这是因为 QLPreviewController 中的第一响应器无法正常注销。

探索解决方案

为了解决这一问题,我尝试了各种方法,但都以失败告终。我尝试使用扩展查找关键窗口,并使用 UIApplication.shared.keyWindow?.endEditing(true) 强制结束编辑,但均无济于事。

灵光乍现

正当我在绝望的边缘时,灵光乍现,我找到了一个可行的解决方案。通过使用 @Environment(\.resignFirstResponder) 变量,我可以在 SwiftUI 视图中管理第一响应器状态,并在需要时通过调用 resignFirstResponder 函数强制注销第一响应器。

struct MyView: View {
    @Environment(\.resignFirstResponder) private var resignFirstResponder
    
    var body: some View {
        VStack {
            QLPreview(url: URL(string: "https://example.com/file.pdf")!)
            
            Button(action: {
                resignFirstResponder()
            }) {
                Text("结束编辑")
            }
        }
    }
}

拨开云雾见晴空

通过使用这种方法,我终于能够有效地强制注销 QLPreviewController 中的第一响应器,从而关闭键盘或 PKToolPicker。这让我松了一口气,并为用户提供了更好的交互体验,允许他们在文本输入和绘制之间无缝切换。

常见问题解答

  • Q:为什么要强制注销第一响应器?
    A:在某些情况下,需要强制注销第一响应器,例如当其他控件需要获取焦点时。
  • Q:@Environment(\.resignFirstResponder) 变量是什么?
    A:这是一个 SwiftUI 环境变量,允许我们访问 resignFirstResponder 函数,该函数可强制注销第一响应器。
  • Q:为什么以前尝试的方法无效?
    A:以前尝试的方法无法成功,可能是因为 QLPreviewController 中的第一响应器位于一个私有视图层次结构中。
  • Q:除了结束编辑之外,还可以使用 @Environment(\.resignFirstResponder) 做什么?
    A:还可以使用它来关闭模态视图或隐藏键盘。
  • Q:在其他框架或平台上是否有类似的方法?
    A:是的,在其他框架和平台上也存在类似的方法,例如在 UIKit 中可以使用 resignFirstResponder() 方法强制注销第一响应器。

结语

通过使用 @Environment(\.resignFirstResponder) 变量,我成功解决了 SwiftUI 中强制注销第一响应器的问题。这为我带来了更好的交互体验,并为用户提供了更流畅的编辑和绘制体验。