我有一个关于如何迅速执行标题中提到的方法的问题。如果我这么做:
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)为什么会这样吗?
发布于 2014-08-31 20:43:35
我想您在第一个片段中指的是popToRootViewControllerAnimated,因为returnToRootViewController不是UUNavigationController上的一个方法。
您的问题是popToRootViewControllerAnimated有一个返回值(从导航堆栈中删除的视图控制器数组)。这会带来麻烦,即使您试图丢弃返回值。
当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语句是最清晰的。
https://stackoverflow.com/questions/25595456
复制相似问题