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

时间:2016-09-15 06:08:42

标签: ios objective-c delegates uicollectionview subclassing

我创建了UICollectionView的子类,在该子类中,我希望覆盖 dataSourcedelegate属性的setter。

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

我该怎么做?

以下是我的所作所为,但却发生错误:数据源未设置

接口文件:

@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子类中合成了delegate和dataSource属性:

@synthesize dataSource = _dataSource;
@synthesize delegate = _delegate;

写了像以下的二传手:

-(void)setDataSource:(id<UICollectionViewDataSource>)dataSource
{
    if (dataSource == self) {
        _dataSource = dataSource;
    }
}

-(void)setDelegate:(id<UICollectionViewDelegate>)delegate
{
    if (delegate == self) {
        _delegate = delegate;
    }
}

1 个答案:

答案 0 :(得分:3)

通过合成子类中的属性所做的是创建新的实例变量。当超类代码检查数据源是否已设置时,答案为否,因为其实例变量仍为nil

删除合成语句,因为无论如何你都将实现setter(并且你不需要提供getter)。

在最重要的制定者中,什么也不做。

要设置实际数据源,请调用[super setDatasource:self]