为什么选择器不调用 swift

Why Selector Not Calling in swift

我正在通过我的视图控制器调用:

Util().nav(self.navigationItem)

而Class是:

class Util: NSObject {

    // MARK: - Initialization
    override init() {
        super.init()

    }

    func nav(navigationItem: UINavigationItem){
        let leftBackArrow = UIBarButtonItem(title: "A", style: .Plain, target: self, action: "backPress:")
        navigationItem.leftBarButtonItem = leftBackArrow;
        leftBackArrow.image = UIImage(named: "nav_back")
    }

    func backPress(sender: UIBarButtonItem){
        print("HI")
    }

}

这是一个 classic 问题。请注意,ARC 需要查看对 Utils 对象的强引用。但在这种情况下,发生的事情是,您正在实例化并调用它的方法。但是 ARC 会认为一旦来自定义 this 的范围的控制权出来,这个对象就可以离开,并且它将释放正在创建的临时 Utils 对象。这就是为什么您的操作永远不会被调用的原因。

要解决这个问题,不要将函数作为成员函数,而是将它们设为 class 个函数-

class Util: NSObject {

class func nav(navigationItem: UINavigationItem){
    let leftBackArrow = UIBarButtonItem(title: "A", style: .Plain, target: self, action: "backPress:")
    navigationItem.leftBarButtonItem = leftBackArrow;
    leftBackArrow.image = UIImage(named: "nav_back")
}

class func backPress(sender: UIBarButtonItem){
    print("HI")
}
}

现在您可以将其用作:

Util.nav(self.navigationItem)

HTH