2014-02-17 56 views
1

我試圖根據使用Reactive Cocoa的scrollview的當前內容偏移y值來更改視圖的可見性。我的想法是在一個NSNumber屬性上創建一個觀察者,該屬性將在scrollview委託的scrollViewDidScroll中進行更改。下面是我添加到viewDidLoad中的代碼:Reactive Cocoa - 基於scrollview內容偏移的視圖可見性

RAC(self.headerView, hidden) = [RACObserve(self, offset) subscribeNext:^(NSNumber *value) { 
    return @([value integerValue] > 0); 
}]; 

設置在return語句斷點,我看到這個被調用一次,但從來沒有一次。我錯過了什麼?

+0

所以,我得到了我正在尋找的行爲,但如果我做錯了事,請糾正我。我創建了一個名爲contentOffset的RACSubject屬性,並在scrollViewDidScroll中調用了該屬性上的sendNext。然後我使用combineLatest:reduce:來設置視圖是否隱藏。 –

回答

4

您所描述的解決方案實現了一個調用-sendNext:的方法,這非常普遍,以至於有一種方法可以完成這一切:-rac_signalForSelector:。在委託的情況下,可以在委託調用-rac_signalForSelector:,像這樣:

與代表來了
RAC(self.headerView, hidden) = [[(id)scrollView.delegate 
    rac_signalForSelector:@selector(scrollViewDidScroll:)] 
    reduceEach:^(UIScrollView *scrollView) { 
     return @(scrollView.contentOffset.y > 0); 
    }]; 

有一個問題是,你必須確保你之前調用任何-rac_signalForSelector:調用指定的委託。

+0

非常好,謝謝你的澄清。 –

+2

對於不接受或返回所有對象參數的方法,還有'-rac_signalForSelector:fromProtocol:'。這裏不是問題,但值得一提。 –

+0

@DaveLee你能解釋一下'map:'如何直接在塊中訪問'UIScrollView'?我嘗試這樣做是行不通的。我總是得到'RACTuple'。 –