UIScrollView реализующий делегат - PullRequest
1 голос
/ 20 апреля 2011

У меня есть контроллер вида, у которого есть три вида прокрутки в качестве подпредставлений. Я хотел бы, чтобы дочерние представления с прокруткой информировали родительский контроллер представления при каждом изменении страницы.

Я думал, что сделаю это, настроив шаблон делегирования. Мой ребенок (подкласс UIScrollView) устанавливает его в заголовочном файле:

@interface TriptychScrollView : UIScrollView <UIScrollViewDelegate> {
    id delegate;
}

- (id)delegate;
- (void)setDelegate:(id)newDelegate;
@end

@protocol RCScrollDidChange
@optional
- (void)scrollView:(TriptychScrollView *)scrollView imageDidChange:(NSNumber *)index;
@end

Исходный файл имеет методы доступа делегата:

- (id)delegate {
    return delegate;
}
- (void)setDelegate:(id)newDelegate {
    delegate = newDelegate;
}

К сожалению, это означает, что моя установка делегата на собственный вызов игнорируется:

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setDelegate:self];
    }
    return self;
}

.. и поэтому два метода scrollViewDidScroll: и scrollViewDidEndDecelerating: не вызываются! Это означает, что я фактически потерял контроль над прокруткой.

Я делаю это неправильно? Или есть ли лучший способ для дочерних подпредставлений отправлять сообщения своим родителям?

1 Ответ

0 голосов
/ 21 апреля 2011

Возможно, я не понимаю всей проблемы, но я не вижу причин для реализации ваших собственных подклассов UIScrollView, и если вы настаиваете на этом, не затеняйте его свойство .delegate или убедитесь, что вы вызываете super.

Я бы подошел к этому, выполнив следующее:

при условии, что все эти прокрутки содержатся в каком-то другом представлении;

UIScrollView *a = ....
a.delegate = self;
a.tag = 1;

UIScrollView *b = ....
b.delegate = self;
b.tag = 2;

UIScrollView *c = ....
c.delegate = self;
c.tag = 3

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
   if (scrollView.tag == 1) 
     //handle a
   else if (scrollView.tag == 2)
     //handle b
   else if (scrollView.tag == 3)
     //handle c
}
...