2015-02-22 6 views
5

Ich habe eine benutzerdefinierte UIView mit einem UITapGestureRecognizer. Die Gestenerkenner ruft eine Methode namens hide() den Blick von der Superview als solche zu entfernen:Ist es möglich, einen Block Completion Handler von einer anderen Funktion in iOS aufzurufen?

func hide(sender:UITapGestureRecognizer){ 
    if let customView = sender.view as? UICustomView{ 
     customView.removeFromSuperview() 
    } 
} 

Die UICustomView auch eine Show() Methode hat, die es als ein Subview fügt hinzu, wie zum Beispiel:

func show(){ 
    // Get the top view controller 
    let rootViewController: UIViewController = UIApplication.sharedApplication().windows[0].rootViewController!! 
    // Add self to it as a subview 
    rootViewController.view.addSubview(self) 
} 

Was bedeutet, dass ich ein UICustomView erstellen und sie als solche angezeigt werden:

let testView = UICustomView(frame:frame) 
testView.show() // The view appears on the screen as it should and disappears when tapped 

Nun, ich möchte, dass meine Show() -Methode in ein Verfahren mit einem Abschluss Block drehen, dass, wenn die Haut genannt wird () Funktion wird ausgelöst. Etwas wie:

testView.show(){ success in 
    println(success) // The view has been hidden 
} 

Aber das zu tun, so würde ich den Abschluss Handler der Show() -Methode von meinem hide() Methode aufrufen müssen. Ist das möglich oder übersehe ich etwas?

Antwort

8

Da Sie die UICustomView implementieren, alles, was Sie tun müssen, ist speichern Sie die 'Completion Handler' als Teil der UICustomView Klasse. Dann rufen Sie den Handler, wenn hide() aufgerufen wird.

class UICustomView : UIView { 
    var onHide: ((Bool) ->())? 

    func show (onHide: (Bool) ->()) { 
    self.onHide = onHide 
    let rootViewController: UIViewController = ... 
    rootViewController.view.addSubview(self) 
    } 

    func hide (sender:UITapGestureRecognizer){ 
    if let customView = sender.view as? UICustomView{ 
     customView.removeFromSuperview() 
     customView.onHide?(true) 
    } 
} 

Natürlich hat jeder UIView einen Lebenszyklus: viewDidAppear, viewDidDisappear usw. Als Ihr UICustomView eine Unterklasse von UIView ist eine der Lifecycle-Methoden außer Kraft setzen könnte:

class UICustomView : UIView { 
    // ... 

    override func viewDidDisappear(_ animated: Bool) { 
    super.viewDidDisappear (animated) 
    onHide?(true) 
    } 
} 

Sie könnten dies berücksichtigen zweiter Ansatz, wenn die Ansicht möglicherweise ohne einen Aufruf von hide() verschwindet, aber Sie wollen immer noch onHide ausführen.

+2

Clever! Und funktioniert wie ein Zauber, danke @GoZoner :) – Audioy

Verwandte Themen