Подтвердить что ты не робот

#ИМЯ?

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

Теперь я пытаюсь создать пользовательский режим размотки, но я не могу заставить метод -segueForUnwindingToViewController: fromViewController: identifier: вызываться.

Я также внедрил -viewControllerForUnwindSegueAction: fromViewController: withSender: в свой контейнер, чтобы я мог указать на правильный контроллер представления (тот, который представил этот модальный), но затем метод, который должен быть запрошен для моего пользовательского разматывания, не вызван нигде.

Прямо сейчас, единственный способ отклонить этот модальный метод - сделать это по методу -returned:.

Может ли кто-нибудь с успехом сделать это с помощью настраиваемого раскручивания?


EDIT: Немного больше кода и контекста

Мой диспетчер просмотра отключен в раскадровке, а не программно.

У меня есть эти куски кода, связанные с развязками в моих контроллерах:

PresenterViewController.m

Я использую собственный метод для отклонения моих пользовательских модалов здесь (-dismissModalViewControllerWithCompletionBlock:).

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController
                                      fromViewController:(UIViewController *)fromViewController
                                              identifier:(NSString *)identifier {
    return [[MyModalUnwindSegue alloc] initWithIdentifier:identifier
                                                   source:fromViewController
                                              destination:toViewController];
}

-(IBAction)returned:(UIStoryboardSegue *)segue {
    if ([segue.identifier isEqualToString:@"InfoUnwindSegue"]) {
        [self dismissModalViewControllerWithCompletionBlock:^{}];
    }
}

MyModalViewController.m

Здесь я использую -viewControllerForUnwindSegueAction: fromViewController: withSender:, чтобы указать на контроллер представления, на который я должен быть занят.

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action 
                                      fromViewController:(UIViewController *)fromViewController 
                                              withSender:(id)sender {
    return self.myPresentingViewController;
}

Поведение, которое я ожидал, заключалось в том, что MyModalViewController был вызван, чтобы указать на контроллер представления, который должен обрабатывать разматывание, а затем этот контроллер представления имел свой метод -segueForUnwindingToViewController: fromViewController: identifier:, вызываемый до вызова -returned:.

Прямо сейчас -segueForUnwindingToViewController: fromViewController: identifier: никогда не вызывается.

Я также должен сказать, что я уже пробовал разные конфигурации. Всюду, когда я возвращаю метод, он не вызывает вызова. Я читал, что я могу подклассифицировать контроллер навигации, а затем он вызван, но я не знаю, как он будет соответствовать моему решению.


РЕДАКТИРОВАТЬ 2: Дополнительная информация

Я проверил, что MyModalViewController имеет свой метод -segueForUnwindingToViewController: fromViewController: identifier:, когда я хочу отклонить обычный контроллер модального представления, представленный им. Это может быть связано с тем, что он является самым большим UIViewController в иерархии.

После проверки этого я подклассифицировал UINavigationController и вместо этого использовал этот подкласс, чтобы содержать мой PresenterViewController. Я был очень удивлен, заметив, что его метод -segueForUnwindingToViewController: fromViewController: identifier: также называется.

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

Мне не нужно создавать логику в этом подклассе, чтобы выбрать, какой класс segue использовать, поскольку этот класс не знает, что сделали их дети.

Форумы Apple сегодня не работают, поэтому сейчас нет возможности получить поддержку. Если у кого-то есть больше информации о том, как это работает, пожалуйста, помогите! Я думаю, что отсутствие документации для этого является хорошим показателем того, насколько неустойчивым это все еще.

4b9b3361

Ответ 1

Чтобы добавить к ответу от @Jeremy, я получил отказ от модального UIViewController к UIViewController, содержащемуся в UINavigationController, для правильной работы (например, как я это ожидал), используя следующее в моем подклассе UINavigationController.

// Pass to the top-most UIViewController on the stack.
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)
             toViewController fromViewController:(UIViewController *)
             fromViewController identifier:(NSString *)identifier {
   UIViewController *controller = self.topViewController;
   return [controller segueForUnwindingToViewController:toViewController
                                  fromViewController:fromViewController
                                          identifier:identifier];
}

.. и затем реализовать segueForUnwindingToViewController, как обычно, в реальном ViewController внутри UINavigationController.

Ответ 2

Этот метод должен быть объявлен на родительском контроллере. Поэтому, если вы используете контроллер навигации с пользовательским segue, подкласс UINavigationController и определите этот метод на нем. Если вы предпочитаете определять его в одном из дочерних представлений UINavigationController, вы можете переопределить canPerformUnwindSegueAction: fromViewController: withSender в UINavigationController, чтобы он искал дочерние элементы для обработчика.

Если вы используете встроенный просмотр (представление контейнера), определите его на родительском контроллере представления.

Смотрите последние 10 минут WWDC 2012 Сессия 407 - Принятие раскадровки в вашем приложении, чтобы понять, почему это работает!

Ответ 3

Если вы используете UINavigationController, а ваш segue вызывает pushViewController, то для использования пользовательского разматывания вам потребуется подкласс UINavigationController и переопределить - (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier.

Скажем, у меня есть обычная раскрутка, называемая CloseDoorSegue. Реализация подкласса UINavigationController может выглядеть примерно так:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {

UIStoryboardSegue* theSegue;

if ([identifier isEqualToString:@"CloseDoor"]) {
    theSegue = [CloseBookSegue segueWithIdentifier:identifier source:fromViewController destination:toViewController performHandler:^(void){}];
} else {
    theSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}

return theSegue;

}

Установите подкласс UINavigationController в качестве класса контроллера навигации в раскадровке. Вам должно быть хорошо, если вы правильно настроили событие "Выход" с "CloseDoor" в качестве идентификатора. Также не забудьте вызывать "popViewControllerAnimated" в вашем режиме разговора вместо увольнения, чтобы поддерживать в соответствии с механизмом push/pop UINavigationControllers.

Ответ 4

библиотека разработки iOS С этим методом обсуждается библиотека разработки iOS. - segueForUnwindingToViewController: fromViewController: идентификатор: Убедитесь, что MyModalViewController является ролью контейнера, а не субконтроллером контейнера. Если есть что-то вроде [anotherVC addChildViewController:myModalViewController];, вы должны поместить метод segueForUnwindingToViewController в какой-то файл "AnotherVC.m".

Обсуждение Если вы реализуете пользовательский контроллер представления контейнера, который также использует отключение segue, вы должны переопределить этот метод. Ваш метод реализация должна создавать экземпляр и возвращать пользовательский объект segue который выполняет любую анимацию и другие шаги, которые необходимы для отключите контроллеры представлений.