0

如果我错了,请告诉我:

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

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

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

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

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

4

2 回答 2

1

可能,

这是您可以使用的最佳模式。Apple 在其各种数据显示视图(如 iPhone 中的 UITableView 和 Mac 中的 NSTableView、NSOutlineView)中排他性地紧随其后。

一切顺利。

于 2009-10-10T18:46:10.197 回答
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 界面对于超级视图来说看起来很干净,并且您正在处理 MyScrollView 中的所有滚动、布局、重绘和内容更新内容,并且不会打扰外部的其他视图或控制器。

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

于 2009-10-10T21:00:01.813 回答