Почему UIImageView.image нужно устанавливать с помощью DispatchQueue.main.asyn c даже в основном потоке - PullRequest
3 голосов
/ 02 апреля 2020

Попытка установить изображение на кнопку при нажатии. Проверено, что обработчик targetAction всегда вызывается в главном потоке.

Это не работает

@objc func buttonTapped() {
     self.mybutton.imageView?.image = MyObjcClass.getImageNamed("DarkVersion")
}

Но это работает:

@objc func buttonTapped() {
    DispatchQueue.main.async { // Does not work without this dispatch
        self.mybutton.imageView?.image = MyObjcClass.getImageNamed("DarkVersion")
    }
}

На отладчике I видно, что оба находятся в основном потоке

Ответы [ 2 ]

5 голосов
/ 02 апреля 2020

Правильный способ установки изображения для кнопки - использование метода setImage(_ image: UIImage?,for state: UIControl.State) .
Когда вы используете прямой доступ для установки изображения, кнопка не знает об этом и не меняет установленное изображение. в процедуре изменения состояния.
На самом деле вам не нужно менять изображение в методе действия кнопки, вам просто нужно установить изображения для состояний и изменить состояние кнопки в этом методе. Кнопка выберет соответствующее изображение для состояния .

0 голосов
/ 02 апреля 2020

Правильный код из контроллера представления должен быть:

class ViewController: UIViewController {
    @IBOutlet weak var myButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(buttonTapped))
        myButton.addGestureRecognizer(tapGesture)
    }

    @objc func buttonTapped() {
        self.myButton.setImage( MyObjcClass().getImageNamed("DarkVersion"), for: .normal)

    }
}

Полный проект того, чего вы пытаетесь достичь, находится в следующем репо: https://github.com/stevencurtis/uiimageviewimage.git

Что работает без сбоев, разница в том, что setImage используется для установки изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...