Swift 中无法观察到 UIPageControl 的 currentPage 变化

Can't observe UIPageControl's currentPage changes in Swift

我有一个 UIPageControl 的子类,我想观察 currentPage 的变化。

不幸的是,当 currentPage 从点击 MyPageControl 发生变化时,我的 currentPagedidSet 没有被调用。

class MyPageControl: UIPageControl {
    override var currentPage: Int {
        didSet {
            // not called when `currentPage` is changed from a tap
            updateSomething(for: currentPage)
        }
    }
}

并且使用 KVO 也无法观察到变化:

class MyPageControl: UIPageControl {
    var observation: NSKeyValueObservation?
    override func awakeFromNib() {
        super.awakeFromNib()
        observation = observe(\.currentPage) { (_, _) in
            // not called when `currentPage` is changed from a tap
            updateSomething(for: self.currentPage)
        }
    }
}

您可以使用 sendAction(_:to:for:) 检测点击并读取当时的 currentPage 值。

class MyPageControl: UIPageControl {
    override func sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
        super.sendAction(action, to: target, for: event)
        updateSomething(for: currentPage)
    }
}

来自 Apple 文档:Apple Doc

当用户点击页面控件移动到下一页或上一页时,该控件发送 valueChanged 事件以供委托处理。然后委托可以评估 currentPage 属性 以确定要显示的页面。页面控件在任一方向上只前进一页。当前查看的页面用白点表示。根据设备的不同,在裁剪之前屏幕上会显示一定数量的点。

代码:

pageControl.addTarget(self, action:#selector(pageControlTapHandler(sender:)), for: .touchUpInside)

//or

pageControl.addTarget(self, action:#selector(pageControlTapHandler(sender:)), for: .valueChanged)



...

func pageControlTapHandler(sender:UIPageControl) {
    print("currentPage:", sender.currentPage) //currentPage: 1
}