You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 15.2及15.4中PDFKit的PDFViewPageChanged通知失效求助

PDFViewPageChanged通知在iOS15.2+版本不触发的解决方案

在iOS15.0及更早版本中,通过NotificationCenter监听PDFViewPageChanged通知可以正常检测PDF页面切换,但iOS15.2及后续版本中该通知可能无法触发,以下是两种可靠的解决方式:

方案一:改用PDFViewDelegate回调(推荐)

Apple官方更推荐使用PDFViewDelegate的回调方法来监听页面变化,该方式在各iOS版本中稳定性更高,不受通知逻辑调整影响。

步骤如下:

  1. 让视图控制器遵守PDFViewDelegate协议
  2. 为PDFView设置delegate
  3. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:54:14