swift 3.0 UIBarButtonItem动作不起作用

lit*_*333 11 uibarbuttonitem swift3

let leftbarbuttonitem = UIBarButtonItem(title:"Reset",style: .plain, target: self, action: #selector(tapResetButton(_:)))

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

    }
Run Code Online (Sandbox Code Playgroud)

该操作无法响应click事件.我添加了断点然后发现它甚至没有进入函数.我不知道我的代码有什么问题.任何答案将不胜感激.提前致谢.

Ash*_*k R 17

Swift 3.0

在ViewDidLoad()中声明UIBarButton

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

func logOut() {
  print("LogOut")
}
Run Code Online (Sandbox Code Playgroud)

声明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")
}
Run Code Online (Sandbox Code Playgroud)

完全声明viewDidLoad()

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

任何应该工作.

对于您的操作参数,您可以明确指定ViewController名称,也可以说self.

action: #selector(self.logOut)
Run Code Online (Sandbox Code Playgroud)


lit*_*333 5

当我把UIBarButtonItem的初始化放到函数viewDidLoad之外时,action就无法响应了。但是当我把它放到函数中时。有用。我不知道为什么。但问题解决了。如果你知道原因。请告诉我。谢谢你。

  • 在函数之外,就在类的主体中,它不会被初始化,因为它显式和隐式地引用了“self”。我认为这是一个错误,编译器在这些情况下不会像在其他情况下那样发出警报。但是,如果您将其声明为 `lazy`,它将起作用,因为在访问该属性时,`self` 已完全形成(参见上面的惰性示例)。 (6认同)