2015-12-16 3 views
2

Я Newbee в развитии IOS и недавно столкнулся с этой проблемой с настраиваемым переходом в прошивке 9.IOS 9 пользовательского переход - animationControllerForDismissedController не называется

У меня есть объект соответствует UIViewControllerTransitioningDelegate протоколу и реализует animationControllerForDismissedController, что-то вроде:

@implementation MyCustomizedTransitioningDelegate 

#pragma mark - UIViewControllerTransitioningDelegate 

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed 
{ 
    MyCustomizedTransitionAnimator *animator = [[MyCustomizedTransitionAnimator alloc] init]; 
    animator.presenting = NO; 
    return animator; 
} 

@end 

И процесс, который вызывает модальный переход что-то вроде:

@implementation MyViewController 

#pragma mark - Initializers 

+ (MyCustomizedTransitioningDelegate *)modalTransitioningDelegateSingletonInstance; 
{ 
    static MyCustomizedTransitioningDelegate *delegateInst = nil; 
    static dispatch_once_t onceToken = 0; 
    dispatch_once(&onceToken, ^{ 
     delegateInst = [[MyCustomizedTransitioningDelegate alloc] init]; 
    }); 

    return delegateInst; 
} 

#pragma mark - UIViewController 

- (void)dismissViewControllerAnimated:(BOOL)animated completion:(void (^)(void))completion; 
{ 
    [self prepareForDismissViewControllerAnimated:animated completion:&completion]; 
    [super dismissViewControllerAnimated:animated completion:completion]; 
} 

- (void)prepareForDismissViewControllerAnimated:(BOOL)animated completion:(dispatch_block_t *)completion; 
{ 
    self.presentedViewController.modalPresentationStyle = UIModalPresentationCustom; 
    self.presentedViewController.transitioningDelegate = [[self class] modalTransitioningDelegateSingletonInstance];  
} 

@end 

Поскольку метод animationControllerForDismissedController не вызывается, MyCustomizedTransitionAnimator не создается, что приводит к его animateTransition, не вызываемому, что вызывает неожиданную проблему в моем приложении. (Извините за мой плохой английский ...)

Я также прилагаю скриншот трассировки стека для iOS8 & iOS9. В iOS 8, animationControllerForDismissedController вызывается после трассировки стека ниже. iOS 8

Но в iOS9, transitionDidFinish называется как-то заранее, что я думаю, вероятно, предотвратить animationControllerForDismissedController называют? iOS 9: <code>transitionDidFinish</code> is called

Мне было интересно, если это ошибка IOS 9 или нет. Любое объяснение или решение проблемы будет принята с благодарностью!

+0

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

+0

@beyowulf Только что отредактировал его. Благодаря! – yvetterowe

+0

Есть ли причина, по которой вы хотите использовать синглтон? Размещение + (MyCustomizedTransitioningDelegate *) modalTransitioningDelegateSingletonInstance; в диспетчере просмотра неловко и, вероятно, почему ваш делегат не вызван. – beyowulf

ответ

0

Вы должны сказать что-то вроде:

MyDestinationViewController *viewController = [[MyDestinationViewController alloc] init]; 
MyCustomizedTransitioningDelegate *transitioningDelegate = [[MyCustomizedTransitioningDelegate alloc]init]; 
viewController.transitioningDelegate = transitioningDelegate; 
viewController.modalPresentationStyle = UIModalPresentationCustom; 
[self presentViewController: viewController animated:YES completion:nil]; 

Или, если вы используете перетекает в prepareForSegue сказать что-то вроде:

MyDestinationViewController *toVC = segue.destinationViewController; 
MyCustomizedTransitioningDelegate *transitioningDelegate = [[MyCustomizedTransitioningDelegate alloc]init]; 
toVC.transitioningDelegate = transitioningDelegate; 
+0

Думаю, я сделал это. Пожалуйста, обратитесь к моему редактированию, спасибо! – yvetterowe

8

Я сталкивался с такой же проблемой.

Надеюсь, это поможет кому-то.

Что исправлено для меня - это сделать объект, который применяет протокол UIViewControllerTransitioningDelegate в качестве экземпляра переменной, чтобы поддерживать с ним прочные отношения.

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

4

У меня была та же проблема.

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

Имея этот старый код, который не работал:

UIViewController *dvc = [self sourceViewController]; 
TransitionDelegate *transitionDelegate = [TransitionDelegate new]; 

dvc.modalPresentationStyle = UIModalPresentationCustom; 
dvc.transitioningDelegate = transitionDelegate; 

[dvc dismissViewControllerAnimated:YES completion:nil]; 

Я изменил первую строку:

UIViewController *dvc = [self sourceViewController].navigationController; 

, и она работала.

Надеюсь, это поможет.

+0

Отлично! Вам нужно установить 'transitionDelegate' на навигационный контроллер, если модаль завернут в него. – GoodSp33d

 Смежные вопросы

  • Нет связанных вопросов^_^