2015-09-22 24 views
6

Moje pytanie brzmi: w jaki sposób mogę uzyskać następujące odrodzenie odprawy niestandardowej do pracy na urządzeniu z wersją wcześniejszą niż iOS 9, a także na urządzeniu z systemem iOS 9?Niestandardowe odświeżanie dla systemu iOS 8 i iOS 9

Mam niestandardowy segment pokazujący kontroler widoku, a następnie odpowiedni segment niestandardowej opcji Unwind. Ten kod działa dobrze w systemie iOS 8 i jest implementowany przez tworzenie podklas UIStoryboardSegue i wdrażanie metody perform. Potem zastąpi następujące metody w moim niestandardowego kontrolera nawigacji:

- (UIStoryboardSegue *) segueForUnwindingToViewController: (UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 
{ 
    UIStoryboardSegue *segue; 
    if([fromViewController isKindOfClass:[MyViewController class]]){ 
     segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue 
    } 
    else{ 
     UIStoryboardSegue *unwindSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue 
     segue = unwindSegue; 
    } 
    return segue; 
} 

W iOS 9, segueForUnwindingToViewController jest przestarzała. Nadal działa dla MyViewController CustomSegue; jednak domyślna zmiana odprężenia nie działa już dla żadnej innej zmiany odprężenia. Mimo, że wywołanie metody na super-powrotach odbywa się w trybie odsuwania, przejście nigdy nie występuje, kontroler widoku nigdy nie jest wyskakiwany, a użytkownik nie może powrócić do poprzedniego ekranu. Tak więc, aby było jasne, jeśli używam zwykłej ścieżki show, odpowiednia relacja rozwijana wywołuje tę nieaktualną metodę, która wywołuje metodę super i nie działa.

Obejrzałem przemówienie WWDC na storyborach, i udało mi się naprawić ten problem w iOS 9 przez a) już nie przesłoniłem tej metody w moim niestandardowym kontrolerze nawigacyjnym, i b) wchodząc do storyboardu, klikając na niestandardową zmianę i wprowadzanie CustomSegue jako klasy Segue. Niestety, ponieważ jestem kierowany na system iOS 7, otrzymuję ostrzeżenie "Tylko niestandardowe segues obsługuje nazwy klas przed iOS 9", a niestandardowa zmiana odprężenia nie działa teraz w systemie iOS 7 lub iOS 8!

Odpowiedz

3

Po wielu próbach i błędach znalazłem obejście. Zauważyłem, że po nadpisaniu segueForUnwindingToViewController, unwindForSegue:towardsViewController nie jest już wywoływana, co stanowi problem. FYI, notatka Apple w UIViewController dla segueForUnwindingToViewController mówi:

Przestarzałe. Zwraca segment, który będzie się rozwijać z kontrolera widoku źródłowego do docelowego za pomocą metody unwindForSegue:towardViewController:. Podczas wykonywania rozwijanego przesunięcia zdefiniowanego w scenorysie, jeśli dowolny kontroler widoku wzdłuż ścieżki rozwijania zastąpi tę metodę i zwróci niezerową wartość, środowisko wykonawcze użyje tego obiektu przesuwającego zamiast konstruowania instancji klasy określonej w Konstruktorze interfejsu.

Część rachunku pogrubione nie wydają się być realizowane, to znaczy, jeśli zastąpić tę metodę, ale powrót nil, unwindForSegue:towardViewController nadal nie jest nazywane i segue nie występuje.

Aby obejść ten problem, byłem w stanie edytować segueForUnwindingToViewController w niestandardowej kontrolera nawigacji:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 
{ 
    UIStoryboardSegue *segue; 
    if([fromViewController isKindOfClass:[MyViewController class]]){ 
     segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue 
    } 
    else{ 
     if([[UIDevice currentDevice].systemVersion floatValue] < 9.0){ 
      return [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue 
     } 
     else{ 
      [super unwindForSegue:segue towardsViewController:toViewController]; 
      return nil; 
     } 
    } 
    return segue; 
} 

UPDATE: Wywołanie [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; wydaje się nadal pracować dla modalnych odwijania segues. Opisany przeze mnie problem zdarza się w przypadku seansów pokazowych. W związku z tym, jeśli twoje urządzenie działa na wersji < 9.0 lub jeśli segue jest modalne, powinieneś jeszcze wywołać starą metodę. Jeśli zadzwonisz pod numer [super unwindForSegue:segue towardsViewController:toViewController];, gdy zmiana jest modalna, segue nie będzie działać/występować.

1

Ja nieznacznie zmodyfikowałem twój kod.
Nie muszę rozważać, czy push lub modalne.
Wygląda na to, że działa dobrze.

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 
{ 
    UIStoryboardSegue *segue; 
    if ([fromViewController isKindOfClass:[MyViewController class]]) { 
     segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue 
    } 
    else { 
     if ([super respondsToSelector:@selector(unwindForSegue:towardsViewController:)]) { 
      [super unwindForSegue:segue towardsViewController:toViewController]; 
     } 
     segue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; 
    } 

    return segue; 
}