【问题标题】:Expanding Cell Transition扩大细胞过渡
【发布时间】:2016-08-20 05:45:24
【问题描述】:

我正在关注 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”的可见界面

【问题讨论】:

    标签: ios objective-c swift animation uiviewcontroller


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多