Swift 中无法观察到 UIPageControl 的 currentPage 变化
Can't observe UIPageControl's currentPage changes in Swift
我有一个 UIPageControl 的子类,我想观察 currentPage
的变化。
不幸的是,当 currentPage 从点击 MyPageControl 发生变化时,我的 currentPage
的 didSet
没有被调用。
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
}
我有一个 UIPageControl 的子类,我想观察 currentPage
的变化。
不幸的是,当 currentPage 从点击 MyPageControl 发生变化时,我的 currentPage
的 didSet
没有被调用。
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
}