2014-08-31 37 views
3

我有一個關於在標題提到的方法中快速實現的問題。如果我這樣做:UIView.animateWithDuration完成

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(測試版6)這樣做?

+0

長期以來,這一直是問題的常見原因。它總是以不同的方式顯示...在這裏看到答案:http://stackoverflow.com/questions/24338842/what-am-i-doing-wrong-in-swift-for-calling-this-objective-c-block- api-call/24347498#24347498 – Jack 2014-08-31 20:49:58

+0

[animateWithDuration:animations:completion:in Swift]的可能重複(http://stackoverflow.com/questions/24296023/animatewithdurationanimationscompletion-in-swift) – Jack 2014-08-31 20:50:58

+0

Ha。我知道這是以前的答案,但沒有找到這個騙局。 (其實,我很確定我已經在這個愚蠢的遊戲之前回答了它,但是我在我的歷史中也找不到它。) – rickster 2014-08-31 21:17:17

回答

8

我認爲你的意思是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語句是最清楚的。

+0

感謝您的解釋和解答。奇蹟般有效 :) – c2programming 2014-09-01 08:36:53