我有一个关于标题中提到的方法的快速实现的问题。如果我这样做:
leadingSpaceConstraint.constant = 0
UIView.animateWithDuration(0.3, animations: {
self.view.layoutIfNeeded()
}, completion: { (complete: Bool) in
self.navigationController.returnToRootViewController(true)
})
我遇到以下问题:调用中缺少参数“延迟”的参数。只有当我在完成部分有 self.navigationController.returnToRootViewController() 时才会发生这种情况。如果我将该语句提取到这样的单独方法中:
leadingSpaceConstraint.constant = 0
UIView.animateWithDuration(0.3, animations: {
self.view.layoutIfNeeded()
}, completion: { (complete: Bool) in
self.returnToRootViewController()
})
func returnToRootViewController() {
navigationController.popToRootViewControllerAnimated(true)
}
然后它完美地工作并且完全符合我的要求。当然,这似乎不是理想的解决方案,更像是一种解决方法。谁能告诉我我做错了什么或者为什么 Xcode (beta 6) 会这样?
最佳答案
我认为您的第一个代码段中的意思是 popToRootViewControllerAnimated
,因为 returnToRootViewController
不是 UUNavigationController
上的方法。
您的问题是 popToRootViewControllerAnimated
有一个返回值(从导航堆栈中删除的 View Controller 数组)。即使您试图丢弃返回值,这也会导致麻烦。
当 Swift 看到一个带有返回值的函数/方法调用作为闭包的最后一行时,它假定您正在使用闭包速记语法来表示隐式返回值。 (那种可以让你写类似 someStrings.map({ $0.uppercaseString })
的东西。)然后,因为你有一个闭包在你期望传递一个返回 void 的闭包的地方返回一些东西,所以方法调用无法进行类型检查。类型检查错误往往会产生错误的诊断消息——我相信如果你使用你拥有的代码和它产生的错误消息 filed a bug 会有所帮助。
无论如何,您可以通过使闭包的最后一行不是带有值的表达式来解决这个问题。我赞成明确的 return
:
UIView.animateWithDuration(0.3, animations: {
self.view.layoutIfNeeded()
}, completion: { (complete: Bool) in
self.navigationController.popToRootViewControllerAnimated(true)
return
})
您还可以将该
popToRootViewControllerAnimated
调用分配给一个未使用的变量,或者在它之后放置一个什么都不做的表达式,但我认为 return
语句是最清楚的。关于ios - UIView.animateWithDuration 完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25595456/