Swift 3.0中UIBarButtonItem动作无法工作

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

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

    }

这个动作不能响应点击事件。我添加了断点,然后发现它甚至没有进入函数。我不知道我的代码有什么问题。非常感谢您的回答。


你可以在 viewDidLoad() 方法中声明 UIBarButton 项目。你的动作方法应该被调用。也许你漏掉了某些东西。 - Ashok R
1
@Ashok 谢谢你的回答。当我把声明UIBarButtonItem放在viewDidLoad()里面时,它可以工作。但是为什么我不能把声明放在viewDidLoad()之外呢? - littlebear333
2
尝试在按钮声明前添加“lazy”。对我有用。 - Mitul Jindal
2个回答

24

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")
}

声明在ViewDidLoad之外的UIBarButtonItem()

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")
}

完全在viewDidLoad()外声明

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

任何都可以。

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

action: #selector(self.logOut)

谢谢你的回答!我一直在想这是怎么回事!!你有没有想法为什么UIBarButtonItem不同呢? - Berty86

5
当我把UIBarButtonItem的初始化放在viewDidLoad函数外面时,该操作无法响应。但当我把它放到函数内部时,就可以工作了。我不知道为什么,但问题得到了解决。如果你知道原因,请告诉我。谢谢。

6
在函数之外,就在类体中,由于明确和隐式地引用了 self,它并不会被初始化。我认为这是编译器在这些情况下没有像其他情况一样发出警告的一个错误。然而,如果你将其声明为 lazy,它将会工作,因为在访问该属性时,self 已经完全形成(参见上面的懒惰示例)。 - Murray Sagal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接