我有一个关于在标题提到的方法中迅速实施的问题。如果我这样做:
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)的表现如此?
答案 0 :(得分:10)
我认为你的第一个代码段中的popToRootViewControllerAnimated
是returnToRootViewController
,因为UUNavigationController
不是popToRootViewControllerAnimated
上的方法。
您的问题是someStrings.map({ $0.uppercaseString })
有一个返回值(从导航堆栈中删除了视图控制器数组)。即使您尝试丢弃返回值,这也会导致麻烦。
当Swift看到一个带有返回值的函数/方法调用作为闭包的最后一行时,它假定您正在使用闭包简写语法来获取隐式返回值。 (允许你编写像return
这样的东西的那种。)然后,因为你有一个闭包,它在你希望传递一个返回void的闭包的地方返回一些东西,所以方法调用无法进行类型检查。类型检查错误往往会产生错误的诊断消息 - 如果您filed a bug使用您拥有的代码及其生成的错误消息,我相信它会有所帮助。
无论如何,你可以通过使闭包的最后一行不是带有值的表达式来解决这个问题。我赞成明确的UIView.animateWithDuration(0.3, animations: {
self.view.layoutIfNeeded()
}, completion: { (complete: Bool) in
self.navigationController.popToRootViewControllerAnimated(true)
return
})
:
popToRootViewControllerAnimated
您也可以将return
调用分配给未使用的变量,或者将表达式放在后面,但我认为{{1}}语句最清楚。