2015-12-22 4 views
1

Я работаю над приложением iOS, и я использую в этом быстрое использование. Для большей читаемости и организации функций я использовал расширения в моем быстром файле.Быстрый контроль доступа, вызывающий проблемы

// 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

Частному доступа ограничивает использование объекта для его собственного определяющего исходного файла. Используйте частный доступ, чтобы скрыть детали реализации определенной функциональности.

Но мой класс, расширение, жест все в одном файле. Я думаю, что здесь отсутствует базовая концепция. Пожалуйста, помогите мне разобраться в этом вопросе.

+1

Кажется, вам просто нужно добавить '@ objc' в метод' private'. См. Http://stackoverflow.com/questions/25056278/swift-access-control-with-target-selectors – sbarow

+0

@sbarow: Спасибо за ссылку, она решила проблему –

ответ

0

Если вы вызываете метод из селектора, и он является закрытым, они не могут быть вызваны, потому что метод вызывается извне. Когда вы вызываете paymentViewSelected() в awakeFromNib, он вызывается внутри класса. Однако, когда он вызывается через Selector, он вызывается извне. подобный object.paymentViewSelected(). Вы не можете вызвать частный метод извне.

1

О вашей точке зрения: Я могу вызвать paymentViewSelected: непосредственно из awakeFromNib, независимо от личного. Но почему он сбой при использовании в качестве селектора?

Его методы, отмеченные private, могут быть доступны внутри класса, но объект класса не может вызвать метод, помеченный private.

В вашем приложении TapGesture он называется с использованием объекта класса автоматически, как только вы нажимаете на представление. В этом случае ваш метод недоступен, поскольку он отмечен private, это причина ошибки при сбое unrecognised selector.

Смежные вопросы