【问题标题】:Is it possible to detect PDFView notifications with Coordinator in UIViewRepresentable?是否可以在 UIViewRepresentable 中使用 Coordinator 检测 PDFView 通知?
【发布时间】: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
}

【问题讨论】:

    标签: swift swiftui pdfview uiviewrepresentable ios-pdfkit


    【解决方案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 函数结束时释放,并且没有任何东西可以处理通知。如果您不想使用通知发布者,则基于闭包的处理程序也可以正常工作(稍后我会将其添加到我的答案中)。另一个不相关的一点是请记住,当当前页面发生变化以及当前 可见 页面发生变化时,会有通知。通常第二个就是你想要的。
    • 我太傻了。非常感谢您的帮助!
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多