2016-11-18 49 views
0

我對Swift非常陌生,嘗試創建一個應用程序,其中頁面之間的滑動正常工作,但也涉及基於滑動距離的背景顏色更改。在Swift中跟蹤滑動移動

因此,我想「劫持」滑動手勢,所以我可以添加一些行爲。我能找到的最好的方法是this question/answer

翻譯從選擇的答案代碼爲斯威夫特3,我下面的代碼添加到我的RootViewControllerviewDidLoad功能:

for subview in (pageViewController?.view.subviews)!{ 
     if let coercedView = subview as? UIScrollView { 
      coercedView.delegate = (self as! UIScrollViewDelegate) 
     } 
    } 

我的印象是,上面的代碼就會讓我delegate功能(如scrollViewDidScroll到我正在編寫上面的代碼的類中,以便我可以定義該函數,調用super.scrollViewDidScroll,然後添加我想要的任何其他功能。

不幸的是,上面的代碼不會拋出任何編譯錯誤,的確,當我嘗試構建應用程序拋出一個錯誤:

Could not cast value of type 'My_App.RootViewController' (0x102cbf740) to 'UIScrollViewDelegate' (0x1052b2b00). 

而且,當我嘗試在我的課寫override func scrollViewDidScroll,我得到一個編譯錯誤告訴我函數不存在覆蓋,這即使我通過了錯誤,也不會被調用,這使我不禁思考,但這不是解決此問題的正確方法。

對不起,這是一個很不好的問題,但我對如何解決這個問題的基本架構以及我是否正確理解給定的答案以及出現了什麼問題感到非常困惑。

我在翻譯delegate,那答案是否正確? 我委託給正確的對象嗎? (這是正確的術語嗎?) 有沒有更好的方法來處理這個問題? 我強制/鑄造不當嗎?我應該改爲做:

view.delegate = (SomeHandMadeViewDelegateWhichDefinesScrollViewDidScroll as! UIScrollViewDelegate) 

或類似的東西/不同(與let coercedSelf = self as? UIScrollViewDelegate什麼的另一個嵌套鑄造

感謝

+0

「當我嘗試寫'重寫func scrollViewDidScroll' ...」實現該特定方法。但它不,所以'覆蓋'是不合適的。所以,(a)聲明你的視圖控制器符合'UIScrollViewDelegate'協議;和(b)實現你想要的任何「UIScrollViewDelegate」方法,而不需要「覆蓋」(除非你的超類恰好實現了這個特定的方法)。 – Rob

回答

2

如果我正確理解你的問題,你想趕上一些滾動位置?!和東西吧?然後做

class RootViewController { 
    // Your stuff 

    for subview in pageViewController!.view.subviews { 
    if let coercedView = subview as? UIScrollView { 
     coercedView.delegate = self 
    } 
} 

extension RootViewController : UIScrollViewDelegate { 
    // Your scrollView stuff there 
} 
class RootViewController { 
    // Your stuff 

    for subview in pageViewController!.view.subviews { 
    if let coercedView = subview as? UIScrollView { 
     coercedView.delegate = self 
    } 
} 

extension RootViewController : UIScrollViewDelegate { 
    // Your scrollView stuff there 
} 
+0

耶!這工作完美。介意確認我對這裏發生的事情的印象,所以我可以更好地理解它?當我編寫'extension'行時,我使用'UIScrollViewDelegate'的基本功能擴展'RootViewController',這允許我將'coercedView'的行爲委託給類本身。那麼我如何從內部獲得位置等信息,比如'scrollViewDidScroll'函數(正在被擊中)? – Sasha

+0

其實,我只是想出了職位的東西。但是如果你有時間的話,我會很樂意得到基本概念的確認。斯威夫特目前真的很困惑。 – Sasha

+1

其實這個擴展是不需要的。你可以只寫類RootViewController:UIScrollViewDelegate,它會做同樣的事情。只是爲了使代碼更清晰。 –