我正在使用iOS应用程序,而且我正在使用swift。为了更好的可读性和组织功能,我在swift文件中使用了扩展名。
// MARK: Class Declaration
class PaymentView
{
// Some stuffs
}
// MARK: Lifecycle methods
extension PaymentView
{
// Overriden for adding gesture recogniser
override func awakeFromNib()
{
super.awakeFromNib()
// Causes a crash when tapped on view
let tapGesture = UITapGestureRecognizer(target: self, action: Selector("paymentViewSelected:"))
self.addGestureRecognizer(tapGesture)
// Works correctly !!!
paymentViewSelected(tapGesture);
}
}
// MARK: Private Methods
extension PaymentView
{
private func paymentViewSelected(sender : UITapGestureRecognizer)
{
print("Method called")
}
}
我的问题是当我点击我的视图时,应用程序因unrecognised selector
错误而崩溃。如果我从方法中删除private
访问控制说明符,它就能完美运行。
我的问题是,无论paymentViewSelected:
如何,我都可以直接从awakeFromNib
拨打private
。但是当它用作选择器时为什么会崩溃?
根据Swift AccessControl Reference
私人访问将实体的使用限制在其自己的定义中 源文件。使用私有访问来隐藏实现细节 一个特定的功能。
但是我的课程,扩展,手势都在同一个文件中。我想我在这里错过了一些基本的关键概念。请帮我理解这个问题。
答案 0 :(得分:1)
关于你的观点:我可以直接从awakeFromNib调用paymentViewSelected:无论是私有的。但是当它用作选择器时为什么会崩溃?
因为标有private
的方法可以在类中访问,但是类的对象不能调用标有private
的方法。
在tapGesture中,一旦点击视图,就会自动使用类对象调用它。
在这种情况下,您的方法不可用,因为它标有private
,这就是崩溃错误unrecognised selector
的原因。
答案 1 :(得分:0)
如果从一个选择器调用一个方法并且它是私有的,则无法调用它们,因为该方法是从外部调用的。当你在awakeFromNib中调用paymentViewSelected()
时,它会在类中调用。但是当它通过Selector调用时,它会从外部调用。比如object.paymentViewSelected()
。你不能从外面打电话给私人方法。