为什么选择器不能快速调用

时间:2016-03-11 04:08:17

标签: swift selector

我通过我的视图控制器调用,如:

Util().nav(self.navigationItem)

班级是:

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

}

1 个答案:

答案 0 :(得分:2)

这是一个经典问题。请注意,ARC需要查看对Utils对象的强引用。但在这种情况下,发生的是,您正在实例化并调用方法。但是,ARC会认为这个对象可以从定义了这个对象的范围出来,它将释放正在创建的临时Utils对象。这就是为什么你的行动永远不会被召唤的原因。

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

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