【问题标题】:Swift access control with target selectors使用目标选择器进行快速访问控制
【发布时间】:2014-07-31 10:13:19
【问题描述】:

看看这个示例代码:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let letterButton = UIButton.buttonWithType(.Custom) as UIButton
        self.view.addSubview(letterButton)
        letterButton.addTarget(self, action:Selector("buttonDidTap:"), forControlEvents: .TouchUpInside)

    }

    func buttonDidTap(button: UIButton!) {
        print(button.char)
    }

}

只要 Selector 是 publicinternalUIButton 的目标操作就可以正常工作,但如果它是 private,它会崩溃由于发送到实例的选择器无法识别

有什么方法可以实现吗?我不想将点击功能设为公开或内部。

【问题讨论】:

    标签: ios swift selector


    【解决方案1】:

    您需要@objc 将私有方法公开给 objc 运行时

    @objc private func buttonDidTap(button:UIButton!) {
        println(button.char)
    }
    

    来自Xcode6 beta4 release notes

    标记为私有的声明不会暴露给 Objective-C 运行时 如果没有其他注释。 IB 网点、IB 行动和核心数据 无论其访问权限如何,托管属性仍然暴露给 Objective-C 等级。如果您需要可以调用私有方法或属性 Objective-C(例如对于使用基于选择器的旧 API 回调),将@objc 属性显式添加到声明中。! !

    【讨论】:

    • 很好的答案。如果您希望能够在 Swift 代码中将您的方法标记为私有,并且仍然能够通过选择器访问它,您也可以使用私有:@objc private func buttonDidTap(button:UIButton!) { ... }
    • 当我尝试从另一个 swift 类调用函数时遇到同样的问题!?如何从另一个类调用一个类中的函数?
    • 这种情况下的最佳做法是什么?
    • 还有,为什么会这样?
    • @FamicTech 您尝试调用的函数的访问级别是多少?确保它不是私有的或文件私有的,并且不包含在私有/文件私有扩展中。请记住,如果另一个类在不同的模块中,则该函数必须具有“公共”或“开放”访问级别。
    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2015-06-30
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多