【问题标题】:Change to UIViewControllerTransitioningDelegate definition for Swift 3 prevents transition [closed]更改 Swift 3 的 UIViewControllerTransitioningDelegate 定义可防止转换 [关闭]
【发布时间】:2016-09-01 17:30:12
【问题描述】:

我一直在关注为 Swift 2 编写的添加自定义过渡的教程:,但我的自定义过渡不会替换现有的。

【问题讨论】:

    标签: ios swift transition viewcontroller


    【解决方案1】:

    对于 Swift 3,在委托定义中使用 animationController( forPresented: 而不是 animationControllerForPresented ( 非常重要。

    extension DataViewController: UIViewControllerTransitioningDelegate {
        func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
                return PresentMenuAnimator() //your replacement
        }
    }
    

    否则你建议的动画师会被忽略。

    Xcode 中的自动更正代码不会标记这一点。

    【讨论】:

    • 如果编译器没有标记您的方法签名错误(对于 Swift 3),您应该提交错误报告。
    • 我会这样做
    【解决方案2】:

    这个问题是由 Swift 3 重命名引起的。特别是,Clang 导入器在可选协议方法方面存在问题:编译器并不总是将您的旧声明与新的重命名声明匹配。因此,你的方法变成了一个永远不会被调用的无用函数:你不会从编译器那里得到任何关于这个问题的警告,因为你没有正确实现的方法是可选的,但是在运行时,Objective-C 看不到你的将函数声明为它正在寻找的方法,因此它不会调用它。

    以下是我为注意和解决此问题而开发的一些技巧:

    • 始终在明确采用协议的扩展中进行声明。如果您不这样做,编译器肯定不会看到您的方法。 (我认为这是 Swift 中的一个错误,并已提交。)

    • 将选择放在函数名称中,然后查看右侧的快速帮助检查器。如果你没有看到帮助——也就是说,如果你看到的只是你的函数声明——你没有正确匹配委托函数。

    • 查看文档!在这种情况下,https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate 显示重命名的签名。标题也是如此:只需通过命令单击术语 UIViewControllerTransitioningDelegate 就会向您显示它们。

    • 如有疑问,请在您的方法前面加上 @objc(...) 属性的 Objective-C 名称。这允许 Objective-C 看到你的方法。这是一个临时的权宜之计,但至少它会让你的代码再次工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2017-07-02
      • 2019-09-11
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多