我正在尝试使用自己的自定义UITableView
创建一个扩展DataSource
的类。
该类名为SHCTableView
。
首先,我创建了一个名为SHCTableViewDataSource.h
的原型类,它扩展了NSObject
。
现在我将属性添加到SHCTableView.h
:
// the object that acts as the data source for this table
@property (nonatomic, assign) id<SHCTableViewDataSource> dataSource;
我收到了警告
Property type 'id<SHCTableViewDataSource>' is incompatible with type 'id<UITableViewDataSource>' inherited from 'UITableView'
和SHCTableView.m
const float SHC_ROW_HEIGHT = 50.0f;
-(void)refreshView {
// set the scrollview height
_scrollView.contentSize = CGSizeMake(_scrollView.bounds.size.width, [_dataSource numberOfRows] * SHC_ROW_HEIGHT);
// add the cells
for (int row=0; row < [_dataSource numberOfRows]; row++) {
// obtain a cell
UIView* cell = [_dataSource cellForRow:row];
// set its location
float topEdgeForRow = row * SHC_ROW_HEIGHT;
CGRect frame = CGRectMake(0, topEdgeForRow, _scrollView.frame.size.width, SHC_ROW_HEIGHT);
cell.frame = frame;
// add to the view
[_scrollView addSubview:cell];
}
}
#pragma mark - property setters
-(void)setDataSource:(id<SHCTableViewDataSource>)dataSource {
_dataSource = dataSource;
[self refreshView];
}
_dataSource
的所有实例都给我一个错误:
Instance variable '_dataSource' is private
还有一堆其他错误,但它们似乎都是由于_dataSource
是私有的,这可能与上面的警告有关。
非常感谢任何帮助。
答案 0 :(得分:0)
UITableView已经声明了dataSource,所以声明为同名并不是一个好主意。只需声明
@property (nonatomic, assign) id<SHCTableViewDataSource> customDataSource;
然后
-(void)setDataSource:(id<SHCTableViewDataSource>)dataSource {
[super setDataSource:_dataSourceInterceptor]
_customDataSource = dataSource;
[self refreshView];
}
如果你必须这样做那么你可以这样做..
创建中间对象作为dataSourceInterceptor,以设置超类的原始dataSource并实现dataSource函数。不要将self设置为dataSource,这不是一个好主意。