2015-02-22 27 views
5

Mam niestandardowe UIView z dołączonym do niego UITapGestureRecognizer. Gest rozpoznawania wywołuje metodę o nazwie hide(), aby usunąć widok z SuperView jako takie:Czy można wywołać obsługę zakończenia bloku z innej funkcji w systemie iOS?

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

UICustomView posiada również metodę show(), która dodaje go jako podrzędny, jako takich:

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

co oznacza, że ​​mogę stworzyć UICustomView i wyświetlić go jako takie:

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

teraz chcę, aby włączyć metodę mój show() do metody z blokiem realizacji, która jest wywoływana, gdy hide () Wywoływana jest funkcja. Coś jak:

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

Ale żeby to zrobić musiałbym zadzwonić do obsługi zakończenia metody show() z metody moim hide(). Czy to możliwe, czy też coś przeoczyłem?

Odpowiedz

8

Od czasu wdrożenia UICustomView, wszystko, co musisz zrobić, to przechowywać "procedurę obsługi zakończenia" jako część klasy UICustomView. Następnie wywołasz procedurę obsługi, gdy zostanie wywołana 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) 
    } 
} 

Oczywiście, każdy UIView ma cykl: viewDidAppear, viewDidDisappear itd Jako twój UICustomView jest podklasą UIView można zastąpić jedną z metod cyklu życia:

class UICustomView : UIView { 
    // ... 

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

Można rozważyć ten drugie podejście, jeśli widok może zniknąć z połączenia hide(), ale nadal chcesz, aby uruchomiono onHide.

+2

Sprytnie! I działa jak urok, dzięki @GoZoner :) – Audioy