是否可以在 UIViewRepresentable 中使用 Coordinator 检测 PDFView 通知?

Posted

技术标签:

【中文标题】是否可以在 UIViewRepresentable 中使用 Coordinator 检测 PDFView 通知?【英文标题】:Is it possible to detect PDFView notifications with Coordinator in UIViewRepresentable? 【发布时间】:2020-12-21 21:33:21 【问题描述】:

我很难弄清楚如何使用 UIViewRepresentable 实现 PDFView。

我知道我可以通过简单的 Binding 从 SwiftUI -> UIKit 获取变量。

我了解我需要使用 Coordinator 来检测 PDFView 通知,例如 PDFViewPageChanged 等,然后通过 Binding 将数据传回。

我找不到如何使用 Coordinator 接收通知的示例。任何帮助将不胜感激。

谢谢

编辑

我已经尝试过 - 不幸的是我从来没有收到过通知

func makeUIView(context: Context) -> PDFView 
    let pdfView = PDFView()
    pdfView.document = pdfDocument
    pdfView.autoScales = true
    
    NotificationCenter.default.publisher(for: .PDFViewPageChanged)
        .map $0.object as? PDFView
        .sink  (view) in
            print("notification received")
        
                
    return pdfView

【问题讨论】:

【参考方案1】:

类似这样的:

struct SPDFView: UIViewRepresentable 
  let document: PDFDocument
  @Binding var selection: String?
  
  func makeUIView(context: Context) -> PDFView 
    let view = PDFView()
    view.document = document
    NotificationCenter.default.publisher(for: .PDFViewSelectionChanged)
      .map  $0.object as? PDFView 
      .sink  (view) in
        // or do something else
        self.selection = view?.currentSelection?.string
      
      .store(in: &cancellables)

// or, if you don't want to use Combine:
// NotificationCenter.default.addObserver(forName: .PDFViewSelectionChanged, object: nil, queue: nil)  (notification) in
//      guard let pdfView = notification.object as? PDFView else  return 
//      self.selection = pdfView.currentSelection?.string
//    

    return view
  

  func updateUIView(_ uiView: PDFView, context: Context) 

【讨论】:

感谢您回复我,恐怕我不会通过该方法收到任何通知。我已将我尝试过的代码添加到我的原始评论中。 .store 不能在 .sink 之后被忽略(你应该得到一个编译器警告)。否则,如果不存储,整个处理程序将在 makeUIView 函数结束时释放,并且没有任何东西可以处理通知。如果您不想使用通知发布者,则基于闭包的处理程序也可以正常工作(稍后我会将其添加到我的答案中)。另一个不相关的一点是请记住,当当前页面发生变化以及当前 可见 页面发生变化时,会有通知。通常第二个就是你想要的。 我太傻了。非常感谢您的帮助!

以上是关于是否可以在 UIViewRepresentable 中使用 Coordinator 检测 PDFView 通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使 UIViewRepresentable 在 tvOS 上具有焦点?

协调器不适用于 UIViewRepresentable?

如何在 SwiftUI 中更改 UIViewRepresentable 内的 UITextField 大小

我如何使用Combine来跟踪UIViewRepresentable类中的UITextField更改?

在 SwiftUI UIViewRepresentable 上刷新 PDFViewer

更新 UIViewRepresentable 中的绑定