告诉我,如果我错了:
我创建了一个新类ScrollViewDataSource。该类符合我在代理中为滚动视图创建的协议。嗯,这是一个非常特殊的委托,在滚动时会做一些非常复杂的事情。因此,该委托在初始化时接收该数据源对象。数据源对象现在有一个方法
因此,当用户滚动时,委托会多次敲响数据源对象,以滚动来请求数据。我将在滚动期间回收视图。这意味着,如果用户向下滚动,我会从顶部到底部删除视图,并用新数据填充它们。
NSArray包含UIView对象,在滚动期间将对其进行适当定位。此外,在首次启动包含滚动视图的视图时,数据源将传递数据以显示第一个可见内容。
这是一个好的模式,还是你有更好的想法? 顺便说一句:我知道UITableView做了类似的事情。但我想知道这一点。这对我来说很实际。谢谢!
答案 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中的所有滚动,布局,重绘和内容更新,而不会打扰来自外部的其他视图或控制器。
但是,如果您的内容视图彼此完全不同,我将不会使用这样的模式。