2016-03-27 3 views
0

Ich mag UITapGestureRecognizer als TapRecognizer so dass die Navigation zwischen den Seiten innerhalb meines app Unterklasse wird in standardisierter Weise behandelt:Subclassing UITapGestureRecognizer in Swift

  1. ein UITapGestureRecognizer auf alle Navigationselemente im Storyboard Schleppen, ihre Klasse Einstellung als TapRecognizer, und sie innerhalb des View-Controller-Referenzierung als IBOutlet (@IBOutlet var heroTapRecognizer: TapRecognizer!)
  2. Initialisiere sie etwa so:

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

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

Aber die oben nicht funktioniert. Ich bin neu bei Swift und habe zuvor nur UITapGestureRecognizer programmgesteuert verwendet.

Hinweis: Die Benutzerinteraktion ist aktiviert auf der UIView, der der Erkenner zugeordnet ist.

+0

@TroyT Ich kann nur mit 'init (target: action:)' initialisieren und da self zu diesem Zeitpunkt nicht initialisiert wird, kann ich die Zieleigenschaft nicht entsprechend setzen –

Antwort

1

eine UITapGestureRecognizer auf alle Navigationselemente im Storyboard Schleppen, ihre Klasse als TapRecognizer Einstellung, und sie innerhalb des View-Controller als IBOutlet

Ok Referenzierung, aber dann wird Ihre init nie aufgerufen werden. Wenn Sie möchten, dass etwas Besonderes passiert, implementieren Sie awakeFromNib.

Alternativ implementieren Sie init(coder:). Aus irgendeinem Grund ist dies nicht dokumentiert, aber es ist der Initializer, der tatsächlich aufgerufen wird.

+1

Endlich richtig; Entschuldigung für die Verwirrung. – matt

+0

Kein Problem, danke für Ihre Hilfe! –

+1

@RyanBrodie Ich schlage vor, Sie löschte Ihre Antwort eher als zu versuchen, Worte in den Mund zu legen, wenn Sie wissen, was ich meine :) – matt