iOS 15.2及15.4中PDFKit的PDFViewPageChanged通知失效求助
PDFViewPageChanged通知在iOS15.2+版本不触发的解决方案
在iOS15.0及更早版本中,通过NotificationCenter监听PDFViewPageChanged通知可以正常检测PDF页面切换,但iOS15.2及后续版本中该通知可能无法触发,以下是两种可靠的解决方式:
方案一:改用PDFViewDelegate回调(推荐)
Apple官方更推荐使用PDFViewDelegate的回调方法来监听页面变化,该方式在各iOS版本中稳定性更高,不受通知逻辑调整影响。
步骤如下:
- 让视图控制器遵守
PDFViewDelegate协议 - 为PDFView设置delegate
- 实现
pdfViewDidChangePage(_:)方法
示例代码:
class YourViewController: UIViewController, PDFViewDelegate { var pdfView: PDFView! override func viewDidLoad() { super.viewDidLoad() // 初始化并配置PDFView pdfView = PDFView(frame: view.bounds) pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(pdfView) // 设置delegate pdfView.delegate = self // 加载PDF文档(示例) if let pdfURL = Bundle.main.url(forResource: "sample", withExtension: "pdf") { pdfView.document = PDFDocument(url: pdfURL) } } // 页面切换时触发的回调 func pdfViewDidChangePage(_ pdfView: PDFView) { guard let currentPage = pdfView.currentPage, let pageIndex = pdfView.document?.index(for: currentPage) else { return } // 这里处理页面切换逻辑,pageIndex从0开始计数,如需显示页码可+1 print("当前页码:\(pageIndex + 1)") } }
方案二:修复通知监听逻辑(若必须使用通知)
如果坚持使用通知,需注意以下两点:
- 注册通知时指定具体的PDFView对象(而非
object: nil),避免接收无关通知 - 在视图销毁时务必移除观察者,防止内存泄漏或无效监听
示例代码:
class YourViewController: UIViewController { var pdfView: PDFView! override func viewDidLoad() { super.viewDidLoad() // 初始化PDFView并加载文档(省略配置代码) // ... // 注册通知,指定具体的pdfView对象 NotificationCenter.default.addObserver(self, selector: #selector(pageDidChange(notification:)), name: .PDFViewPageChanged, object: pdfView) } @objc private func pageDidChange(notification: Notification) { guard let currentPage = pdfView.currentPage, let pageIndex = pdfView.document?.index(for: currentPage) else { return } print("当前页码:\(pageIndex + 1)") } // 视图销毁时移除观察者 deinit { NotificationCenter.default.removeObserver(self, name: .PDFViewPageChanged, object: pdfView) } }
补充说明
iOS15.2之后Apple调整了PDFView的内部通知发送逻辑,导致PDFViewPageChanged通知的触发时机不再稳定(比如快速滚动时可能不触发),因此优先推荐使用PDFViewDelegate的方式实现页面监听。
内容的提问来源于stack exchange,提问作者alones
相关产品推荐
相关产品推荐

