2016-09-01 28 views

回答

7

對於Swift 3,在代理定義中使用animationController(forPresented:而不是animationControllerForPresented (非常重要。

extension DataViewController: UIViewControllerTransitioningDelegate { 
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
      return PresentMenuAnimator() //your replacement 
    } 
} 

否則你的建議動畫師會被忽略。

這不是由Xcode中的自動更正代碼標記的。

+0

如果編譯器沒有標記您的方法簽名是錯誤的(對於Swift 3),您應該提交錯誤報告。 – matt

+0

我會這樣做的 –

1

此問題是由Swift 3 rename化引起的。特別是,Clang導入程序在使用可選的協議方法時遇到了問題:編譯程序並不總是將您的舊聲明與新的已重新聲明的聲明進行匹配。因此,你的方法變成了一個永遠不會被調用的無用函數:你不會從編譯器得到關於這個問題的任何警告,因爲你沒有正確實現的方法是可選的,但是在運行時,Objective-C沒有看到你的聲明函數作爲它正在查找的方法,所以它不會調用它。

這裏有一些提示我已經開發了注意和解決這個問題:

  • 總是讓你申報的延伸明確採用的協議。編譯器將當然如果你不這樣做,看不到你的方法。 (我認爲這是Swift中的一個bug,並已將其提交。)

  • 將選定內容放入函數名稱中,然後查看右側的快速幫助檢查器。如果你沒有看到幫助 - 也就是說,如果你看到的只是你的函數聲明 - 你沒有正確地匹配委託函數。

  • 看看文檔!在這種情況下,https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate顯示重新整理的簽名。標題也是如此:只需單擊命令,單擊UIViewControllerTransitioningDelegate就會向您顯示它們。

  • 如有疑問,請使用@objc(...)屬性將方法的Objective-C名稱粘貼在您的前面。這允許Objective-C看到你的方法。這是一個暫時的權宜之計,但至少它會讓你的代碼再次運行。