【发布时间】:2016-09-01 17:30:12
【问题描述】:
我一直在关注为 Swift 2 编写的添加自定义过渡的教程:,但我的自定义过渡不会替换现有的。
【问题讨论】:
标签: ios swift transition viewcontroller
我一直在关注为 Swift 2 编写的添加自定义过渡的教程:,但我的自定义过渡不会替换现有的。
【问题讨论】:
标签: ios swift transition viewcontroller
对于 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 重命名引起的。特别是,Clang 导入器在可选协议方法方面存在问题:编译器并不总是将您的旧声明与新的重命名声明匹配。因此,你的方法变成了一个永远不会被调用的无用函数:你不会从编译器那里得到任何关于这个问题的警告,因为你没有正确实现的方法是可选的,但是在运行时,Objective-C 看不到你的将函数声明为它正在寻找的方法,因此它不会调用它。
以下是我为注意和解决此问题而开发的一些技巧:
始终在明确采用协议的扩展中进行声明。如果您不这样做,编译器肯定不会看到您的方法。 (我认为这是 Swift 中的一个错误,并已提交。)
将选择放在函数名称中,然后查看右侧的快速帮助检查器。如果你没有看到帮助——也就是说,如果你看到的只是你的函数声明——你没有正确匹配委托函数。
查看文档!在这种情况下,https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate 显示重命名的签名。标题也是如此:只需通过命令单击术语 UIViewControllerTransitioningDelegate 就会向您显示它们。
如有疑问,请在您的方法前面加上 @objc(...) 属性的 Objective-C 名称。这允许 Objective-C 看到你的方法。这是一个临时的权宜之计,但至少它会让你的代码再次工作。
【讨论】: