我创建了UICollectionView
的子类,在该子类中,我希望覆盖 dataSource
和delegate
属性的setter。
它使用另一个segmentSelectionDelegate
和segmentDataSource
属性(可以由调用者设置)来填充数据。我想禁止调用者设置原始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;
}
}
答案 0 :(得分:3)
通过合成子类中的属性所做的是创建新的实例变量。当超类代码检查数据源是否已设置时,答案为否,因为其实例变量仍为nil
。
删除合成语句,因为无论如何你都将实现setter(并且你不需要提供getter)。
在最重要的制定者中,什么也不做。
要设置实际数据源,请调用[super setDatasource:self]
。