是否可以在 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 上具有焦点?
如何在 SwiftUI 中更改 UIViewRepresentable 内的 UITextField 大小
我如何使用Combine来跟踪UIViewRepresentable类中的UITextField更改?