Не удается наблюдать изменения текущей страницы UIPageControl в Swift - PullRequest
0 голосов
/ 24 мая 2019

У меня есть подкласс UIPageControl, и я хотел бы наблюдать за изменениями в currentPage.

К сожалению, мои currentPage didSet не вызываются, когда currentPage изменяется от нажатий на MyPageControl.

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

И изменения нельзя наблюдать с помощью КВО:

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)
        }
    }
}

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Из Apple Doc: 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
}
1 голос
/ 24 мая 2019

Вы можете обнаружить ответвления с помощью 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)
    }
}
...