覆盖 UICollectionView 子类中的委托和数据源设置器
Override delegate and datasource setters in UICollectionView subclass
我创建了 UICollectionView
的子类,在该子类中我想 覆盖 dataSource
和 delegate
属性的设置器。
它使用另一个 segmentSelectionDelegate
和 segmentDataSource
属性(可以由调用者设置)来填充数据。我想禁止调用者设置原始数据源和委托属性,因为子类本身就是数据源和委托。
我该怎么做?
下面是我所做的,但它抛出了一个错误:未设置数据源。
接口文件:
@class ZISegmentCollectionView;
@protocol ZISegmentCollectionViewDelegate <NSObject>
-(void)segmentCollectionView:(ZISegmentCollectionView *)collectionView didSelectSegmentWithName:(NSString *)segmentName;
@end
@protocol ZISegmentCollectionViewDataSource <NSObject>
-(NSUInteger)segmentCollectionView:(ZISegmentCollectionView *)collectionView badgeCountForSegment:(NSString *)segmentName;
-(NSString *)segmentCollectionView:(ZISegmentCollectionView *)collectionView nameForSegmentAtIndexPath:(NSIndexPath *)indexPath;
-(NSUInteger)numberOfSegmentsInSegmentCollectionView:(ZISegmentCollectionView *)collectionView;
@end
@interface ZISegmentCollectionView : UICollectionView
@property(nonatomic, readonly) NSString * selectedSegmentName;
@property(nonatomic, weak) id<ZISegmentCollectionViewDelegate> segmentSelectionDelegate;
@property(nonatomic, weak) id<ZISegmentCollectionViewDataSource> segmentDataSource;
@end
我在 UICollectionView
子类中合成了委托和数据源属性:
@synthesize dataSource = _dataSource;
@synthesize delegate = _delegate;
像这样写了 setter:
-(void)setDataSource:(id<UICollectionViewDataSource>)dataSource
{
if (dataSource == self) {
_dataSource = dataSource;
}
}
-(void)setDelegate:(id<UICollectionViewDelegate>)delegate
{
if (delegate == self) {
_delegate = delegate;
}
}
您通过综合子类中的属性所做的是创建新的实例变量。当超类代码检查是否设置了数据源时,答案是否定的,因为它的实例变量仍然是nil
.
删除综合语句,因为无论如何您都将实施 setter(并且您不需要提供 getter)。
在你的重写 setter 中,什么都不做。
要设置实际数据源,请调用 [super setDatasource:self]
。
我创建了 UICollectionView
的子类,在该子类中我想 覆盖 dataSource
和 delegate
属性的设置器。
它使用另一个 segmentSelectionDelegate
和 segmentDataSource
属性(可以由调用者设置)来填充数据。我想禁止调用者设置原始数据源和委托属性,因为子类本身就是数据源和委托。
我该怎么做?
下面是我所做的,但它抛出了一个错误:未设置数据源。
接口文件:
@class ZISegmentCollectionView;
@protocol ZISegmentCollectionViewDelegate <NSObject>
-(void)segmentCollectionView:(ZISegmentCollectionView *)collectionView didSelectSegmentWithName:(NSString *)segmentName;
@end
@protocol ZISegmentCollectionViewDataSource <NSObject>
-(NSUInteger)segmentCollectionView:(ZISegmentCollectionView *)collectionView badgeCountForSegment:(NSString *)segmentName;
-(NSString *)segmentCollectionView:(ZISegmentCollectionView *)collectionView nameForSegmentAtIndexPath:(NSIndexPath *)indexPath;
-(NSUInteger)numberOfSegmentsInSegmentCollectionView:(ZISegmentCollectionView *)collectionView;
@end
@interface ZISegmentCollectionView : UICollectionView
@property(nonatomic, readonly) NSString * selectedSegmentName;
@property(nonatomic, weak) id<ZISegmentCollectionViewDelegate> segmentSelectionDelegate;
@property(nonatomic, weak) id<ZISegmentCollectionViewDataSource> segmentDataSource;
@end
我在 UICollectionView
子类中合成了委托和数据源属性:
@synthesize dataSource = _dataSource;
@synthesize delegate = _delegate;
像这样写了 setter:
-(void)setDataSource:(id<UICollectionViewDataSource>)dataSource
{
if (dataSource == self) {
_dataSource = dataSource;
}
}
-(void)setDelegate:(id<UICollectionViewDelegate>)delegate
{
if (delegate == self) {
_delegate = delegate;
}
}
您通过综合子类中的属性所做的是创建新的实例变量。当超类代码检查是否设置了数据源时,答案是否定的,因为它的实例变量仍然是nil
.
删除综合语句,因为无论如何您都将实施 setter(并且您不需要提供 getter)。
在你的重写 setter 中,什么都不做。
要设置实际数据源,请调用 [super setDatasource:self]
。