Расширяющийся клеточный переход

ios objective-c swift animation uiviewcontroller

180 просмотра

1 ответ

Я следую за https://github.com/RabbitMC/inbox-replica, чтобы сделать версию Objective-C для реплики входящей реплики, но я застрял в коде, где я не могу сделать код Objective-C.

Вот код Swift:

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let duration = transitionDuration(transitionContext)
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    let containerView = transitionContext.containerView()


    var foregroundViewController = toViewController
    var backgroundViewController = fromViewController

    if type == .Dismissing {
        foregroundViewController = fromViewController
        backgroundViewController = toViewController
    }

    // get target view
    var targetViewController = backgroundViewController
    if let navController = targetViewController as? UINavigationController {
        targetViewController = navController.topViewController!
    }

    let targetViewMaybe = (targetViewController as? ExpandingTransitionPresentingViewController)?.expandingTransitionTargetViewForTransition(self)

А вот мой код Objective-C:

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    NSTimeInterval duration = [self transitionDuration:transitionContext];
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *containerView = [transitionContext containerView];

    UIViewController *foregroundViewController = toViewController;
    UIViewController *backgroundViewController = fromViewController;

    if (type == Dismissing) {
        foregroundViewController = fromViewController;
        backgroundViewController = toViewController;
    }

    //get the target view
    UIViewController *targetViewController = backgroundViewController;
    if ([targetViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navController = (UINavigationController *)targetViewController;
        targetViewController = navController.topViewController;
    }

    UIView *targetViewMaybe = ([targetViewController conformsToProtocol:@protocol(ExpandingTransitionPresentingViewController)])?[targetViewController expandingTransitionTargetViewForTransition:self]:assert(targetViewMaybe != nil);

Теперь проблема возникает в тот момент, когда мне пришлось вызвать метод протокола, на targetViewControllerкотором UIViewControllerкомпилятор выдает ошибку:

UIViewController не имеет видимого интерфейса, который объявляет селектор 'expandingTransitionTargetViewForTransition'

Автор: Ali Abdul Jabbar Источник Размещён: 08.11.2019 10:56

Ответы (1)


1 плюс

Решение

Причиной проблемы является то, что targetViewControllerимеет тип UIViewController. Но вы пытаетесь вызвать метод из какого-то протокола. Решение состоит в том, чтобы привести указатель к соответствующему типу после проверки его соответствия протоколу.

Сделайте себе одолжение и избегайте длинных, трудных для чтения и невозможных для отладки строк, подобных последней:

UIView *targetViewMaybe = ([targetViewController conformsToProtocol:@protocol(ExpandingTransitionPresentingViewController)])?[targetViewController expandingTransitionTargetViewForTransition:self]:assert(targetViewMaybe != nil);

Разделите это на что-то управляемое. Следующее исправляет проблему и делает код намного проще для чтения и отладки:

if ([targetViewController conformsToProtocol:@protocol(ExpandingTransitionPresentingViewController)]) {
    id<ExpandingTransitionPresentingViewController> controller = (id<ExpandingTransitionPresentingViewController>)targetViewController;
    UIView *targetView = [controller expandingTransitionTargetViewForTransition:self];
    // Do something with targetView
} else {
    // Handle as needed
}
Автор: rmaddy Размещён: 20.08.2016 05:55
Вопросы из категории :
32x32