覆盖 UICollectionView 子类中的委托和数据源设置器

Override delegate and datasource setters in UICollectionView subclass

我创建了 UICollectionView 的子类,在该子类中我想 覆盖 dataSourcedelegate 属性的设置器。

它使用另一个 segmentSelectionDelegatesegmentDataSource 属性(可以由调用者设置)来填充数据。我想禁止调用者设置原始数据源和委托属性,因为子类本身就是数据源和委托。

我该怎么做?

下面是我所做的,但它抛出了一个错误:未设置数据源

接口文件:

@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]