2014-02-17 26 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'。 –