我的VC中有以下代码:
[RACObserve(self.viewModel, searchMode) subscribeNext:^(NSNumber *value) {
@strongify(self);
BOOL isSearchMode = [value boolValue];
self.searchBarView.hidden = !isSearchMode;
if (isSearchMode) {
[self.searchBar becomeFirstResponder];
self.yContentOffset = self.collectionView.contentOffset.y;
[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x, 0) animated:NO];
} else {
[self.searchBar resignFirstResponder];
[self.collectionView setContentOffset:CGPointMake(self.collectionView.contentOffset.x, self.yContentOffset) animated:NO];
}
}];
其中yContentOffset
是VC的属性,我试图删除。 (它在进入搜索模式之前保存内容偏移并在之后恢复)。
我已经尝试[RACSignal if: then: else:]
,但没有完全理解。
答案 0 :(得分:3)
在self.viewModel.searchMode
执行时,您需要更改三个不同的值,因此我认为您要做的第一件事是split the signal,并将它们分别取出。
RACSignal * searchModeSig = [[RACObserve(self.viewModel, searchMode) distinctUntilChanged]
publish]
signal];
hidden
状态很简单:
RAC(self.searchBarView, hidden) = [searchModeSig not];
我上面使用了distinctUntilChanged
因为你对集合视图的y偏移的信号似乎是“0如果searchMode
是YES
,那么最后的非零值”。如果searchMode
信号的值连续为YES
或NO
,那么您最终也会在偏移值流中出现重复,这会使用{{1获得你想要的价值。 replayLast
仅传递代表从distinctUntilChanged
到YES
的转换的值,反之亦然。
NO
每当RAC(self.collectionView, contentOffset) =
[RACSignal if:searchModeSig
then:[RACSignal return:[NSValue valueWithCGPoint:CGPointMake(self.collectionView.contentOffset.x, 0)]
else:[RACObserve(self.collectionView, contentOffset) replayLast]];
过渡到y
时,这应该将0 searchMode
值插入流中,并取以前的值(当然,这可能是已转换为YES
时从其他地方更新过。
对于搜索栏的第一个响应者状态,使用NO
执行此操作似乎是合理的,但您也可以这样做:
subscribeNext:
您已将RAC(self.searchBar, DLShouldBeFirstResponder) = searchModeSig;
和becomeFirstResponder
调用转换为伪属性,如下所示:
resignFirstResponder
也许lifting将是从信号到命令性调用的“官方”方式,但我不确定如何/如果它适用于无参数方法。