popToRootViewControllerAnimated

popToRootViewControllerAnimated

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

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/

10-10 20:45