2012-10-27 24 views
8

Używam Xcode 4.5 i iOS 6.iOS 6 storyboardy: modalne widok nie jest odwoływanie

buduję uniwersalną aplikację korzystającą storyboardy. Mam jeden kontroler widoku, który ma przycisk na pasku nawigacyjnym. Po naciśnięciu przycisku używam ruchu, aby przedstawić inny kontroler widoku jako modalny. Modalny kontroler widoku ma przycisk Anuluj i przycisk Zapisz na pasku nawigacyjnym. W scenorysie elementy przycisku modalnego są powiązane z działaniami na nowej akcji, która ma na celu rozwinięcie nadrzędnego kontrolera widoku, odrzucenie modala i wywołanie procedury działania.

Działa to dobrze na iPhone, ale widzę problemy na iPadzie. Na iPadzie, gdy modal jest prezentowany na pełnym ekranie, wszystko działa. Kiedy zmieniam tryb na arkusz strony lub arkusz formularzy (co jest pożądanym zachowaniem w moim przypadku), wywoływana jest funkcja obsługi akcji, ale kontroler widoku modalnego nie jest automatycznie odrzucany.

Czy ktoś inny widział to zachowanie? Czy jest coś, co zrobiłeś, aby to naprawić?

Dziękuję.

Odpowiedz

6

Dziękuję za pytanie o to, ponieważ właśnie napotkałem ten sam problem. Zakładam, że to błąd, ale jeszcze nie złożyłem go w Apple. W międzyczasie, łatwym obejściem jest wywołanie dismissViewController:animated: w swojej implementacji unwind: (czyli w metodzie akcji związanej z odpinaniem odpadu za pomocą ikony Wyjście), co powoduje dezorientację widoku modalnego.

Moim jedynym zmartwieniem dotyczącym tego rozwiązania jest to, że jeśli ten jest błędem, a Apple w końcu to naprawi, czy ich naprawa złamie jakikolwiek kod przy użyciu tego obejścia? Tylko czas pokaże ...

Później Edytuj: Odkryłem znacznie ładniejszy sposób obejścia tego problemu. Podklasuj klasę nadrzędną (kontenerową) klasy, którą chcesz rozwinąć i zaimplementuj w niej rozwinięcie. Na przykład w mojej aplikacji, sytuacja wygląda następująco:

UISplitViewController 
    UINavigationController 
     MasterViewController 
    UINavigationController 
     DetailViewController ----> modal segue ----> ThirdViewController 

Wyjście/odwijania segue od ThirdViewController powrotem do DetailViewController pokazuje błąd - realizacja unwind: nazywa, ale widok forma nie została zwolniona. Ale jeśli podklasuję UISplitViewController i implementuję tam unwind:, to działa dobrze. (Implementacja unwind: może być pusta, chodzi o to, że widok formularza jest automatycznie odrzucany.) Oczywiście jest to kwestia związana z kontrolerami widoków kontenerów, i można to rozwiązać, pozwalając kontenery je obsłużyć.

zobaczyć moje przykład projekt przesłany do https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch19p561containerViewControllerStoryboard3Bug

+0

To zadziałało dla mnie. Należy przyjąć jako poprawną odpowiedź. – MiuMiu

4

Chłodny jeśli modalne kontroler widoku zostały odrzucone automatycznie, ale w przykładzie Apple here, używają modalnego przejścia dla segue ale potem jawnie wywołać dismissViewControllerAnimated: Zakończenie: w rozwiń (Wyjdź), aby go zamknąć.

2

miałem ten sam problem, więc to, co zrobiłem, było:

- (IBAction)closeSalesJournal:(UIStoryboardSegue *)segue 
{ 
    // Unwind Segue 
    NSLog(@"Closed Sales journal VC"); 

    // For iPad, need to dismiss the view controller manually 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

ten sposób, jestem pewien opuścić standardowy sposób dla iPhone i wymusić zwolnienie z iPada.

0

Miałem podobny problem z tym. Mój modalny segue nie odprężyłby się. Po zbyt długim czasie zmarnowałem problem. To moja wina.

Miałem źle napisane - (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender w kontroler docelowy. Nie spodziewałem się nowej ścieżki, którą właśnie napisałem, więc powrócił NO. W gruncie rzeczy, moim nowym segue'om mówiono, żeby nie relaksowali się przy pomocy jakiegoś innego kodu.

Powiązane problemy