Пользовательский UIStoryboardSegue с использованием segueWithIdentifier: source: destination: performHandler:

Я пытаюсь использовать пользовательский UIStoryboardSegue для реализации перехода между двумя диспетчерами. Я могу сделать это путем подкласса UIStoryboardSegue, а затем установить этот класс в IB. Тем не менее, я смотрел на документы, которые говорят:

Если вашему segue не нужно хранить дополнительную информацию или предоставлять что-либо, кроме метода выполнения, рассмотрите возможность использования метода segueWithIdentifier: source: destination: performHandler:. Вместо этого.

Предполагая, что вам не нужно создавать пользовательский подкласс, просто используйте пользовательский executeHandler.

Я смущен относительно того, куда должен идти этот код, и как я его использую. Я создаю segue как обычно в IB, а затем переопределяю это, прежде чем он будет запущен (возможно, в shouldPerformSegue: или аналогичный). В других документах Apple говорится:

Ваше приложение никогда не создает объекты segue напрямую; они всегда создаются от вашего имени iOS при срабатывании segue

Поэтому я не совсем понимаю, почему они говорят, чтобы создать экземпляр segue с помощью метода создания класса.

Ответы

Ответ 1

Точка segueWithIdentifier:source:destination:performHandler:

  • Предоставьте альтернативу UIViewController performSegueWithIdentifier:sender в тех случаях, когда вы также хотите создать настраиваемый переход, не создавая подкласс segue.
  • Vend segue, который может использоваться как возврат для segueForUnwindingToViewController:fromViewController:identifier

Как отмечалось выше, этот подход является только жизнеспособным для сегментов, которые вы бы назвали вручную, т.е. не для сегментов, которые в противном случае запускались бы через триггеры IB.

Так, например, если у вас есть segue, который должен быть запущен после определенного периода ожидания (например, пользовательский экран блокировки), вы можете использовать segueWithIdentifier:source:destination:performHandler: для обработки пользовательского перехода.

-(void)appTimeoutLockScreen
{
    UIStoryboardSegue *segue = 
                [UIStoryboardSegue segueWithIdentifier:@"LockScreenSegue" 
                                                source:sourceVC 
                                           destination:destinationVC 
                                        performHandler:^{
                     // transition code that would 
                     // normally go in the perform method
                }];
    // Dev is responsible for calling prepareForSegue and perform.
    // Note, the order of calls for an IB triggered segue as well as
    // a performSegueWithIdentifier segue is perform first, then
    // prepareForSegue:sender. Manual segues need to inverse the call
    // in order to ensure VC setup is finished before transition.
    [self prepareForSegue:segue sender:self];
    [segue perform];
}

Другое практическое применение метода - разматывание сегментов. Использование аналогичного сценария в предыдущем примере мы могли бы использовать его для возврата segue для перехода с экрана блокировки обратно на предыдущий viewController:

-(UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController*)toVC 
                                     fromViewController:(UIViewController *)fmVC
                                             identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue = 
            [UIStoryboardSegue segueWithIdentifier:@"FromLockScreenSegue" 
                                            source:fmVC
                                       destination:toVC 
                                    performHandler:^{
                // transition code
            }];

    return segue;
}

Ответ 2

Если вы хотите добавить функциональность, просто переопределите метод "prepareForSegue".

Не забудьте создать segue в своем построителе интерфейса раскадровки, затем измените его на пользовательский и назовите его под идентификатором indentifier и раскадровки.

Вам нужно будет установить контроллер представления назначения, и вы сможете установить переход при использовании

[self presentViewController:YOUR_DESTINATION_VIEW_CONTROLLER animated:YES completion:nil];

после создания объекта вашего контроллера точки назначения.

(Извините за короткое объяснение, это написано на моем iPhone, не стесняйтесь обращаться ко мне с любым дополнительным вопросом).