Как заставить это работать, когда я посылаю вызов функции #selector функции objc, у которой есть параметр по умолчанию - PullRequest
0 голосов
/ 11 января 2019

События вызывают функцию #selector в нескольких местах и ​​нуждаются в разных значениях параметров. Одним из параметров, которые я здесь использую, является значение по умолчанию (Bool). Но когда вызывается функция setBar, значение по умолчанию всегда ложно.

Что я делаю не так?

// the to be called function, done by a target action event from a segmentedControl.changeEvent or by a DispatchQueue delay or during a viewDidAppear.

@objc func setBar(segmentedControl: UISegmentedControl, animated: Bool = true) {
    func adjustBar() {
        self.bar!.frame.origin.x = (self.segmentedControl!.frame.width / CGFloat(self.segmentedControl!.numberOfSegments)) * CGFloat(self.segmentedControl!.selectedSegmentIndex)
    }
    if animated == true {
        UIView.animate(withDuration: 0.2) {
            adjustBar()
        } }
    else {
        adjustBar()
    }
}


// the code that set the target & action for the segmentedControl
segmentedControl!.addTarget(self, action: #selector(setBar), for:UIControl.Event.valueChanged)


// code called when setting the index by code
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
        self.setBar(segmentedControl: self.segmentedControl!, animated: false)
    }

Все работает, кроме значения по умолчанию. Любые предложения, чтобы это исправить?

Спасибо вам за ответ. Но если я использую true, как;

  DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
        self.setBar(segmentedControl: self.segmentedControl!, animated: true)
    }

тогда это работает. Так что читая упомянутую статью, подпись работает

Или, если я что-то изменю / переверну, скажу неправильно, это сработает.

@objc func setBar(segmentedControl: UISegmentedControl, notAnimated : Bool = false) {
    func adjustBar() {
        self.bar!.frame.origin.x = (self.segmentedControl!.frame.width / CGFloat(self.segmentedControl!.numberOfSegments)) * CGFloat(self.segmentedControl!.selectedSegmentIndex)
    }

    print("notAnimated = \(notAnimated)")
    if notAnimated == false {
        UIView.animate(withDuration: 0.2) {
            adjustBar()
        } }
    else {
        adjustBar()
    }
}
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
        self.setBar(segmentedControl: self.segmentedControl!, notAnimated: true)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...