Как бы вы реализовали объект dataSource для UIScrollView?

Скажите, если я ошибаюсь:

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

  • (NSArray *) subviewsFromIndex: (NSInteger) fromIndex toIndex: (NSInteger) toIndex;

поэтому, когда пользователь прокручивает, делегат звонит объекту источника данных много раз, выполняя прокрутку, чтобы запросить данные. Я собираюсь повторно использовать просмотры во время прокрутки. Это означает, что если пользователь прокручивает страницу вниз, я удаляю представления сверху вниз и заполняю их новыми данными.

NSArray содержит объекты UIView, которые будут располагаться соответствующим образом во время прокрутки. Кроме того, при первом запуске представления, которое содержит представление прокрутки, источник данных доставит данные для отображения первого видимого содержимого.

Это хороший образец или у вас есть идеи получше? Кстати: я знаю, что UITableView делает нечто подобное. Но я хочу этому научиться. Для меня это практика. Спасибо!


person Thanks    schedule 08.05.2009    source источник
comment
Привет, не могли бы вы поделиться идеей о том, как вы добились повторного использования просмотров? Я ломаю себе голову, пытаясь получить оптимизированную производительность прокрутки с контролем страницы.   -  person Praveen S    schedule 05.03.2011


Ответы (2)


Мая,

Это лучший узор, который вы можете использовать. Исключительно Apple в различных представлениях отображения данных, таких как UITableView на iPhone и NSTableView, NSOutlineView на Mac.

Всего наилучшего.

person Shreekara    schedule 10.10.2009

Если ваши представления содержимого используют один и тот же макет, я бы сделал ScrollViewDataSource, содержащий только те данные, которые необходимы представлениям содержимого, поэтому мне не нужно выделять / создавать новый UIView для моего UIScrollView при запросе новых данных (поскольку MyScrollView содержит представления содержимого, которые я можно использовать повторно):

@interface MyScrollView : UIView {
@private
    id <MyScrollViewDelegate> _delegate;
    id <MyScrollViewDataSource> _dataSource;

    UIScrollView *_scrollView;
    NSMutableArray *_contentViews; // you need to create/maintain/reuse contentView from here
}

@property (nonatomic, assign) id <MyScrollViewDelegate> delegate;
@property (nonatomic, assign) id <MyScrollViewDataSource> dataSource;
@end

@protocol MyScrollViewDataSource <NSObject>
@optional
- (NSString *)myScrollView:(MyScrollView *)myScrollView requestTitleForContentViewAtIndex:(NSInteger)index;
- (UIImage *)myScrollView:(MyScrollView *)myScrollView requestLogoForContentViewAtIndex:(NSInteger)index;
@end

...

Преимущество этого заключается в том, что ваш интерфейс MyScrollView будет выглядеть чистым для супервизора, и вы имеете дело со всеми прокруткой, макетом, перерисовкой и обновлением содержимого в своем MyScrollView И, не беспокоя другие представления или контроллеры извне.

Но если ваши представления контента полностью отличаются друг от друга, я не буду использовать подобный шаблон.

person digdog    schedule 10.10.2009