Reactive Cocoa — просмотр видимости на основе смещения содержимого прокрутки

Я пытаюсь изменить видимость представления на основе текущего значения смещения содержимого y для прокрутки с использованием Reactive Cocoa. Моя мысль состояла в том, чтобы создать наблюдателя для свойства NSNumber, которое будет изменено в scrollViewDidScroll делегата scrollview. Вот код, который я добавил в viewDidLoad:

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

Установив точку останова на операторе return, я вижу, что это вызывается один раз, но больше никогда. Что мне не хватает?


person Dan Berry    schedule 17.02.2014    source источник
comment
Итак, я получил поведение, которое искал, но, пожалуйста, поправьте меня, если я делаю что-то не так. Я создал свойство RACSubject с именем contentOffset и в scrollViewDidScroll вызываю sendNext для этого свойства. Затем я использую combLatest:reduce: чтобы установить, скрыто ли представление.   -  person Dan Berry    schedule 18.02.2014


Ответы (1)


Решение, которое вы описываете, реализующее метод, который вызывает -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: вызовы перед назначением делегата.

person Dave Lee    schedule 17.02.2014
comment
Также есть -rac_signalForSelector:fromProtocol: для методов, которые не принимают или не возвращают все аргументы объекта. Здесь это не проблема, но стоит упомянуть. - person Justin Spahr-Summers; 18.02.2014
comment
@DaveLee, не могли бы вы объяснить, как map: позволяет получить доступ к UIScrollView непосредственно в блоке? Мои попытки сделать это не работают. Я всегда получаю RACTuple. - person Paul Young; 18.02.2014
comment
Я предполагаю, что это работает, только если метод принимает только один аргумент. - person Paul Young; 18.02.2014
comment
@PaulYoung Моя ошибка, это должно быть -reduceEach:, а не -map:, я исправлю ответ. Это ошибка, которую я всегда делаю :/, спасибо, что поймали ее. - person Dave Lee; 18.02.2014
comment
Отличный пример. Кстати, если вам нужно получать сигнал только тогда, когда происходит изменение, вы можете использовать DifferentUntilChanged. Это позволит избежать многократного вызова set hidden. - person Ricardo Contreras; 10.07.2015