UIBarButtonItem не работает при создании в качестве свойства, но работает при создании в функции - PullRequest
1 голос
/ 10 июля 2019

У меня есть UIBarButtonItem в правой части моей навигации, которая имеет изображение шестеренки и представляет мой контроллер просмотра настроек.Я могу заставить его работать должным образом, когда создаю кнопку в setupNavigationBar(), но она не работает, если я создаю кнопку как свойство.Я не могу обернуть голову тем, что будет отличаться в этих двух сценариях.Кнопка присутствует в обеих ситуациях, но функциональность отсутствует.

Эта версия не работает

class DecksController: UIViewController {

    let settingsBarButton: UIBarButtonItem = {
        let barButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"), style: .plain, target: self, action: #selector(presentSettings))
        return barButton
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationBar()
    }

    @objc func presentSettings() {
        let settingsController = SettingsController()
        self.navigationController?.pushViewController(settingsController, animated: true)
    }

    func setupNavigationBar() {
        self.navigationItem.rightBarButtonItem = settingsBarButton
    }
}

Эта версия работает

class DecksController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationBar()
    }

    @objc func presentSettings() {
        let settingsController = SettingsController()
        self.navigationController?.pushViewController(settingsController, animated: true)
    }

    func setupNavigationBar() {
        let settingsBarButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"), style: .plain, target: self, action: #selector(presentSettings))
        self.navigationItem.rightBarButtonItem = settingsBarButton
    }
}

1 Ответ

2 голосов
/ 10 июля 2019

Как вы обнаружили, в этой строке очень важно:

let barButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"), 
    style: .plain, target: self, action: #selector(presentSettings))

Проблема в части target:self.Когда элемент кнопки панели настроен как часть инициализатора свойства экземпляра (ваш первый пример), экземпляр еще не существует - это то, что мы инициализируем.Так что self не имеет смысла, и кнопка заканчивается без target.Следовательно, нажатие кнопки ничего не делает.

(На самом деле, если говорить технически, self - это класс, но это не полезно знать.)

Во втором примере,эта строка является частью viewDidLoad, которая работает значительно после , когда экземпляр контроллера представления появился и был инициализирован.viewDidLoad это метод экземпляра, на самом деле.Так что self является примером, как вы ожидаете.

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