2015-02-22 26 views
5

Ho un UIView personalizzato con un UITapGestureRecognizer ad esso collegato. Il riconoscimento gesto chiama un metodo chiamato nascondere() per rimuovere la vista dal superview quanto tale:È possibile chiamare un gestore di completamento blocchi da un'altra funzione in iOS?

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

l'UICustomView ha anche un metodo show() che aggiunge come una visualizzazione secondaria, come tale:

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) 
} 

il che significa che posso creare un UICustomView e visualizzarla come tale:

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

Ora, voglio trasformare il metodo mio show() in un metodo con un blocco di completamento che viene chiamato quando la pelle () viene attivata la funzione. Qualcosa di simile:

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

Ma per farlo avrei dovuto chiamare il gestore completamento del metodo show() dal mio metodo hide(). È possibile o sto trascurando qualcosa?

risposta

8

Poiché si sta implementando lo UICustomView, è sufficiente memorizzare il 'gestore di completamento' come parte della classe UICustomView. Quindi si chiama il gestore quando viene richiamato hide().

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) 
    } 
} 

Naturalmente, ogni UIView ha un ciclo di vita: viewDidAppear, viewDidDisappear, ecc Come il vostro UICustomView è una sottoclasse di UIView si potrebbe ignorare uno dei metodi del ciclo di vita:

class UICustomView : UIView { 
    // ... 

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

Si potrebbe considerare questo secondo approccio se la vista potrebbe scomparire con una chiamata a hide() ma si desidera comunque eseguire onHide.

+2

Intelligente! E funziona come un fascino, grazie a @GoZoner :) – Audioy