2016-11-03 2 views
3
let leftbarbuttonitem = UIBarButtonItem(title:"Reset",style: .plain, target: self, action: #selector(tapResetButton(_:))) 

    func tapResetButton(_ sender:UIBarButtonItem){ 
     count = 0 
     numberLabel.text = "0" 

    } 

Действие не может реагировать на событие click. Я добавил точку останова, после чего обнаружил, что он даже не входит в функцию. Я понятия не имею, что не так с моим кодом. Любой ответ будет оценен. Заранее спасибо.swift 3.0 UIBarButtonItem action не работает

+0

Вы можете объявить 'UIBarButton' элемент внутри' viewDidLoad() 'метода. Ваш метод actin должен быть вызван. может быть, вам что-то не хватает. –

+1

@ Ашок Спасибо за ваш ответ. Когда я помещаю объявление UIBarButtonItem в viewDidLoad(), он работает. Но почему я не могу объявить объявление вне viewDidLoad()? – littlebear333

ответ

6

Swift 3,0

Объявляет UIBarButton внутри ViewDidLoad()

override func viewDidLoad() { 
    super.viewDidLoad() 
    let logout: UIBarButtonItem = UIBarButtonItem.init(title: "Logout", style: .plain, target: self, action: #selector(ViewController.logOut)) 
} 

func logOut() { 
    print("LogOut") 
} 

Объявляет UIBarButtonItem OutSide ViewDidLoad()

var logout:UIBarButtonItem = UIBarButtonItem() 

override func viewDidLoad() { 
     super.viewDidLoad() 
     logout = UIBarButtonItem.init(title: "Logout", style: .plain, target: self, action: #selector(ViewController.logOut)) 
} 

func logOut() { 
     print("LogOut") 
} 

Declare Полностью за пределами viewDidLoad()

lazy var logout: UIBarButtonItem = { 
    UIBarButtonItem.init(title: "Logout", style: .plain, target: self, action: #selector(ViewController.logOut)) 
}() 

Все должно работать.

Для вашего параметра действия либо вы можете указать имя ViewController явно или вы можете просто сказать self.

action: #selector(self.logOut) 
1

Когда я положил инициализацию UIBarButtonItem из функции viewDidLoad, действие не может ответить. Но когда я включил его в функцию. Оно работает. Я не знаю почему. Но проблема решена. Если вы знаете причину. Пожалуйста, скажите мне. Спасибо.

+2

Вне функции, только там, в теле класса, она не инициализируется, потому что она явно и неявно ссылается на 'self'. Я думаю, что это ошибка, которую компилятор не предупреждает в таких ситуациях, как в других. Однако, если вы объявите его «ленивым», он будет работать, потому что к тому времени, когда доступ к ресурсу «self» полностью сформирован (см. Ленивый пример выше). –

Смежные вопросы