繁体   English   中英

UIView.animateWithDuration完成

[英]UIView.animateWithDuration completion

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

leadingSpaceConstraint.constant = 0
UIView.animateWithDuration(0.3, animations: {
    self.view.layoutIfNeeded()
}, completion: { (complete: Bool) in
    self.navigationController.returnToRootViewController(true)
})

我遇到以下问题:在调用中缺少参数'delay'的参数。 只有在完成部分中有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有一个返回值(从导航堆栈中删除的视图控制器数组)。 即使您尝试丢弃返回值,这也会导致麻烦。

当Swift看到一个带有返回值的函数/方法调用作为闭包的最后一行时,它假定您正在使用闭包简写语法来获取隐式返回值。 (允许你编写someStrings.map({ $0.uppercaseString }) 。)然后,因为你有一个闭包,它返回一个你希望传递一个返回void的闭包的地方,方法调用没有打字检查。 类型检查错误往往会产生错误的诊断消息 - 我确信如果你提交了一个包含你所拥有的代码的错误以及它产生的错误消息,它会有所帮助。

无论如何,你可以通过使闭包的最后一行不是带有值的表达式来解决这个问题。 我赞成明确的return

UIView.animateWithDuration(0.3, animations: {
    self.view.layoutIfNeeded()
}, completion: { (complete: Bool) in
    self.navigationController.popToRootViewControllerAnimated(true)
    return
})

你也可以将popToRootViewControllerAnimated调用分配给一个未使用的变量,或者放一个在它之后什么都不做的表达式,但我认为return语句是最清晰的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM