您将如何为UIScrollView实现dataSource对象?

时间:2009-05-08 11:30:49

标签: iphone cocoa-touch uikit uiview uiscrollview

告诉我,如果我错了:

我创建了一个新类ScrollViewDataSource。该类符合我在代理中为滚动视图创建的协议。嗯,这是一个非常特殊的委托,在滚动时会做一些非常复杂的事情。因此,该委托在初始化时接收该数据源对象。数据源对象现在有一个方法

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

因此,当用户滚动时,委托会多次敲响数据源对象,以滚动来请求数据。我将在滚动期间回收视图。这意味着,如果用户向下滚动,我会从顶部到底部删除视图,并用新数据填充它们。

NSArray包含UIView对象,在滚动期间将对其进行适当定位。此外,在首次启动包含滚动视图的视图时,数据源将传递数据以显示第一个可见内容。

这是一个好的模式,还是你有更好的想法? 顺便说一句:我知道UITableView做了类似的事情。但我想知道这一点。这对我来说很实际。谢谢!

2 个答案:

答案 0 :(得分:1)

月,

这是您可以使用的最佳模式。 Apple在其各种数据显示视图中独家跟随,如iPhone中的UITableView和Mac中的NSTutlineView,NSTutlineView。

一切顺利。

答案 1 :(得分:0)

如果你的内容视图使用相同的布局,我会让ScrollViewDataSource只包含所需内容视图的数据,所以在询问新数据时我不需要为我的UIScrollView分配/创建新的UIView(因为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界面对于superview来说看起来很干净,你正在处理MyScrollView中的所有滚动,布局,重绘和内容更新,而不会打扰来自外部的其他视图或控制器。

但是,如果您的内容视图彼此完全不同,我将不会使用这样的模式。