Свифт |UIBarButton не работает / не собирается действовать цели - PullRequest
0 голосов
/ 01 февраля 2019

поэтому я создал пользовательский UIBarButtonItem вне класса и установил его свойства.я добавил его в контроллер навигации отдельным методом, который вызывается из viewDidLoad ().цель для кнопки объявлена ​​внутри самого класса.Я даже пытался добавить точку останова в методе target, чтобы убедиться, что он работает, но, как оказалось, кнопка не достигает цели и выполняет нажатие, несмотря на точки останова.Я сделал весь код программно.

Я попробовал ответы на эти вопросы на stackoverflow, но не сработал.

, когда я объявляю кнопку внутри viewDidLoad, цель распознает кнопку иКнопка также не отображается.

Заранее спасибо, ниже приведен код для того же

// inside class but outside viewDidLoad
    let volumeButton = UIBarButtonItem(image: UIImage(named: "speaker"), style: UIBarButtonItem.Style.plain , target: self, action: #selector(volumeButtonTapped(_ :)))

//// inside a custom method which is called from viewDidLoad()
self.navigationItem.leftBarButtonItem = volumeButton

//// below is the target declared inside the class
@objc func volumeButtonTapped(_ sender: Any) {
    if volume=="loud"{
        volume = "mute"
        volumeButton.image = UIImage(named: "mute")
        print("volume set to mute")
        //UserDefaults.standard.set(volume, forKey: "mute")
    }
     if volume == "mute"{
        volume = "loud"
        volumeButton.image = UIImage(named: "speaker")
        print("volume set to loud")
        //UserDefaults.standard.set(volume, forKey: "speaker")
    }
}

1 Ответ

0 голосов
/ 01 февраля 2019

Цель (self) по-прежнему nil, когда вы инициализируете volumeButton, как и вы.Вместо этого сделайте кнопку lazy var:

lazy var volumeButton = UIBarButtonItem(image: UIImage(named: "speaker"), style: .plain , target: self, action: #selector(volumeButtonTapped))

Как сказал @Robert Dresler, вам также нужно заменить второй оператор if в функции volumeButtonTapped на else if, чтобы ваш код работал- хотя это не имеет ничего общего с проблемой целевого действия.

Вы также можете сделать свой код немного чище, используя решение, подобное следующему:

var deviceIsMuted = false {
    didSet {
        volumeButton.image = UIImage(named: deviceIsMuted ? "mute" : "speaker")
        print("volume set to", deviceIsMuted ? "mute" : "loud")
    }
}

@objc func volumeButtonTapped(_ sender: Any) {
    deviceIsMuted = !deviceIsMuted
}
...