UIView.animateWithDuration完成

时间:2014-08-31 19:23:13

标签: ios swift xcode uiviewanimation

我有一个关于在标题提到的方法中迅速实施的问题。如果我这样做:

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)的表现如此?

1 个答案:

答案 0 :(得分:10)

我认为你的第一个代码段中的popToRootViewControllerAnimatedreturnToRootViewController,因为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}}语句最清楚。