2016-03-27 4 views
0

Я хочу подкласс UITapGestureRecognizer, как TapRecognizer так, что навигация между страницами в пределах моего приложения обрабатываются стандартным образом:подклассов UITapGestureRecognizer в Swift

  1. перетаскиванием UITapGestureRecognizer на любые навигационные элементы в раскадровке, устанавливая их класс как TapRecognizer, и ссылки на них в View Controller как IBOutlet (@IBOutlet var heroTapRecognizer: TapRecognizer!)
  2. Инициирование их так:

    self.heroTapRecognizer = TapRecognizer.init(pageId: 1, pageType: PageType.CategoryPage) 
    

Тогда в TapRecognizer.swift:

class TapRecognizer: UITapGestureRecognizer { 
    var pageId:Int! 
    var pageType:PageType! 

    convenience init(pageId: Int, pageType: PageType) { 
     self.init() 
     self.pageId = pageId 
     self.pageType = pageType 
     self.addTarget(self, action: #selector(TapRecognizer.handleTap(_:))) 
    } 

    func handleTap(sender: UITapGestureRecognizer) { 
     if sender.state == .Ended { 
      print("Handle navigation based on pageId + pageType") 
     } 
    } 
} 

Но выше не работает. Я новичок в Swift и только ранее использовал UITapGestureRecognizer программно.

Примечание: взаимодействие с пользователем : включено на UIView, с которым связан распознаватель.

+0

@TroyT Я могу только инициализировать с помощью 'init (target: action:)', и поскольку self не инициализируется в этот момент, я не могу установить целевое свойство соответственно. –

ответ

1

Перетаскивание UITapGestureRecognizer на любых навигационных элементов в раскадровке, устанавливая их класс как TapRecognizer, и ссылки на них в View Controller как IBOutlet

Хорошо, но тогда ваш init никогда не будет называться. Если вы хотите что-то особенное, выполните awakeFromNib.

В качестве альтернативы можно использовать init(coder:). По какой-то причине это не задокументировано, но это фактически инициализатор.

+1

Наконец-то это правильно; извините за путаницу. – matt

+0

Без проблем, спасибо за помощь! –

+1

@RyanBrodie Я предлагаю вам восстановить ваш ответ, а не пытаться сложить слова в рот, если вы понимаете, что я имею в виду :) – matt

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