2014-02-17 2 views
1

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

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

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

+0

Итак, у меня есть поведение, которое я искал, но, пожалуйста, поправьте меня, если я что-то сделаю неправильно. Я создал свойство RACSubject, называемое contentOffset, и в scrollViewDidScroll я вызываю sendNext в этом свойстве. Затем я использую combLatest: 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'. –

Смежные вопросы