2014-09-09 15 views
28

Piszę aplikację na system iOS 8 i używam nowych prezentacji adaptacyjnych przy użyciu kombinacji "Pokaż" i "Pokaż szczegóły" oraz showViewController:sender: i showDetailViewController:sender: metody.Co jest programowym przeciwieństwem programu showViewController: nadawca:

Moje pytanie brzmi: jaki jest programowy sposób powrotu po zadzwonieniu pod numer showViewController:sender:? Sposób wyświetlania kontrolera widoku zależy od kontekstu nadrzędnego. Na przykład. w UINavigationControllershowViewController:sender: popycha nowy kontroler na stos nawigacyjny, ale jeśli nie ma żadnego kontenera UIKit na grafu kontrolera widoku, to zamiast tego zamiast niego wyświetla się showViewController:sender:.

Zważywszy mogę napisać własny dowolny kontroler kontenerów wydaje się niemożliwe, by sprawdzić

if (self.navigationController) { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
else if (self.presentingViewController){ 
... 
else if ([self.parentViewController isKindOfClass:[CrazyCustomContainer class]]){ 
    [self.parentViewController someWackyUnwindMethod]; 
} 
... 

itp ... więc nie jest to ogólny sposób, aby odwrócić pokazano? Jeśli nie, jedynym rozwiązaniem, jakie widzę, jest użycie odwijania seguesów na wszystko. Nie za dużo kłopotów, ale jestem ciekawy.

+1

Myślę, że częścią tego jest to, że model ma przycisk "Anuluj" i wywoła zwykłe "dismissViewControllerAnimated:", a za pomocą kontrolera nawigacji będzie miał wbudowany przycisk "Wstecz". Dlatego nie musisz często obsługiwać zwolnień w taki sam sposób, jak prezentacje uchwytów. –

+1

Ale to jest mój punkt: 'showViewController:' może zrobić albo push lub prezentacji. Przedstawiony kontroler widoku nie powinien wiedzieć, w jaki sposób został wyświetlony na ekranie, więc robienie czegoś takiego jak '[self.navigationController popViewControllerAnimated:]' w prezentowanym nie jest dobre, jeśli czasami może się nie udać, ponieważ został przedstawiony ... – jackslash

+0

Cóż za navController nie musiałbyś pop. Miałby grzbiet. –

Odpowiedz

20

Istnieje rozdział o tym, jak showViewController:sender: i działają w Programming iOS 8: Dive Deep into Views, View Controllers, and Frameworks.

Gdy te metody są wywoływane, wywołują na siebie targetViewControllerForAction:sender: i wywołują tę metodę na zwróconym obiekcie. Obiekt docelowy może następnie wyświetlać kontroler widoku we właściwy sposób. Na przykład kontroler nawigacyjny przesuwa kontroler widoku na stos nawigacyjny.

Można więc utworzyć ogólną metodę dismissVC: i nadpisać ją w różnych podklasach UIViewController.

extension UIViewController { 
    func dismissVC(sender:AnyObject?) { 
     if let presentingVC = targetViewControllerForAction("dismissVC", withSender: sender) as? UIViewController { 
      presentingVC.dismissVC(self) 
     } 
    } 
} 

extension UINavigationController { 
    override func dismissVC(sender: AnyObject?) { 
     popViewControllerAnimated(true) 
    } 
} 

extension CrazyCustomContainer { 
    override func dismissVC(sender: AnyObject?) { 
     someWackyUnwindMethod() 
    } 
} 

W ten sposób, gdy dzwonisz dismissVC: metodę, jeśli zawsze będzie poprawnie oddalenie widoku kontrolera w zależności od kontekstu.

+0

Tak, to jest odpowiedź. Dobra robota. – jackslash

+8

Więc na tej podstawie rzeczywista odpowiedź na pytanie "Czy istnieje programowe przeciwieństwo do' showViewController: sender: '?" nie jest**. Musisz skutecznie wdrożyć własną wersję generyczną, używając tego samego podstawowego mechanizmu, którego używa Apple do prezentacji adaptacyjnej. – smileyborg

+0

Tak to dotyczy. Chociaż w pytaniu szukam raczej programowej alternatywy dla rozwijania seguesów, które również potrzebują kodu do ich obsługi. Ta odpowiedź w 100% spełnia to, co chciałem. – jackslash

0

Oto sztuczka, której użyłem przed istnieniem programu showViewController, który może pomóc.

if let nav = navigationController { 
    // We have a navigation controller so we'll have a back button 
} 
else { 
    // no navigation controller, need a cancel button 
    // ... Add Cancel Button 
} 

Zasadniczo sprawdza się, gdzie się znajdujesz. Następnie możesz umieścić dowolny kod zapisu w viewDidDisappear lub coś podobnego, ponieważ działa on dla obu. Inną opcją jest sprawdzenie pod kątem presentationViewController, ale nie zawsze gwarantuje to prezentację modalną.

Powiązane problemy