Пользовательский Unwind Segue для iOS 8 и iOS 9

Мой вопрос: как заставить следующий настраиваемый этап раскрутки работать на устройстве с версией до iOS 9, а также на устройстве под управлением iOS 9?

У меня есть Custom Segue, показывающий контроллер представления, а затем соответствующий Custom Unwind Segue. Этот код отлично работал в iOS 8 и реализован путем создания подклассов UIStoryboardSegue и реализации метода perform. Затем я переопределяю следующий метод в своем пользовательском контроллере навигации:

- (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;
}

В iOS 9 segueForUnwindingToViewController устарело. Он по-прежнему работает для MyViewController CustomSegue; однако этап раскрутки по умолчанию больше не работает ни для каких других переходов раскрутки. Несмотря на то, что вызов метода в super возвращает переход отката, переход никогда не происходит, контроллер представления никогда не выталкивается, и пользователь никогда не может вернуться к предыдущему экрану. Так что просто для ясности: если я использую обычный переход шоу, соответствующий переход раскрутки вызывает устаревший метод, который вызывает метод в super и не работает.

Я смотрел доклад WWDC о раскадровках и смог решить эту проблему в iOS 9: а) больше не переопределяя этот метод в моем пользовательском контроллере навигации, и б) зайдя в раскадровку, щелкнув пользовательский переход и введя CustomSegue в качестве класса перехода. К сожалению, поскольку я ориентируюсь на iOS 7, я получаю предупреждение «Только пользовательские переходы поддерживают имена классов до iOS 9», а настраиваемый переход раскрутки теперь не работает для iOS 7 или iOS 8!


person Josh Gafni    schedule 22.09.2015    source источник


Ответы (2)


После долгих проб и ошибок я нашел обходной путь. Я заметил, что когда вы переопределяете segueForUnwindingToViewController, unwindForSegue:towardsViewController больше не вызывается, в этом проблема. К вашему сведению, примечание Apple в UIViewController для segueForUnwindingToViewController гласит:

Устарело. Возвращает переход, который будет раскручиваться от исходного к целевому контроллеру представления с помощью метода unwindForSegue:towardViewController:. При выполнении перехода отката, определенного в раскадровке, если какой-либо контроллер представления на пути отмотки переопределил этот метод и возвращает ненулевое значение, среда выполнения будет использовать этот объект перехода вместо создания экземпляра класса указанный в Интерфейсном Разработчике.

Часть оператора, выделенная жирным шрифтом, похоже, не реализована, т. Е. Если вы переопределяете этот метод, но возвращаете nil, unwindForSegue:towardViewController все равно не вызывается и переход не происходит.

Чтобы обойти эту проблему, я смог отредактировать segueForUnwindingToViewController в своем пользовательском контроллере навигации:

- (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;
}

ОБНОВЛЕНИЕ: вызов [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; по-прежнему работает для модальных переходов раскрутки. Проблема, которую я описал, похоже, возникает для сегментов шоу. Следовательно, если ваше устройство работает на версии ‹ 9.0 или если переход является модальным, вам все равно следует вызывать старый метод. Если вы вызываете [super unwindForSegue:segue towardsViewController:toViewController];, когда переход является модальным, переход не будет работать/возникать.

person Josh Gafni    schedule 24.09.2015

Я немного изменил ваш код.
Мне не нужно думать о том, будет ли push или модальный режим.
Кажется, он работает нормально.

- (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;
}
person Hiroshi Murata    schedule 28.09.2015