Как вы обнаружили, в этой строке очень важно:
let barButton = UIBarButtonItem(image: #imageLiteral(resourceName: "settings"),
style: .plain, target: self, action: #selector(presentSettings))
Проблема в части target:self
.Когда элемент кнопки панели настроен как часть инициализатора свойства экземпляра (ваш первый пример), экземпляр еще не существует - это то, что мы инициализируем.Так что self
не имеет смысла, и кнопка заканчивается без target
.Следовательно, нажатие кнопки ничего не делает.
(На самом деле, если говорить технически, self
- это класс, но это не полезно знать.)
Во втором примере,эта строка является частью viewDidLoad
, которая работает значительно после , когда экземпляр контроллера представления появился и был инициализирован.viewDidLoad
это метод экземпляра, на самом деле.Так что self
является примером, как вы ожидаете.