2016-09-15 2 views
1

Я создал подкласс UICollectionView и в этом подклассе я хочу переопределить сеттеры dataSource и delegate свойств.Override делегат и DataSource сеттеры в UICollectionView подкласса

Он использует другие объекты segmentSelectionDelegate и segmentDataSource (которые могут быть установлены вызывающим абонентом) для заполнения данных. Я хочу запретить установку исходных данныхSource и делегировать свойства вызывающим, потому что сам подкласс является dataSource и делегатом.

Как я могу это сделать?

Ниже я пишу об ошибке: Источник данных не задан.

файл интерфейса:

@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 

Я синтезируется делегат и DataSource свойства в UICollectionView подкласса:

@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; 
    } 
} 

ответ

3

Что вы делали путем синтеза свойств в ваш подкласс создает новые переменные экземпляра. Когда код суперкласса проверяет, установлен ли источник данных, ответ отрицательный, поскольку его переменная экземпляра по-прежнему равна nil.

Оставьте инструкции синтезатора, потому что вы все равно будете внедрять сеттер (и вам не нужно предоставлять получателя).

В своем основном сетевом устройстве ничего не делайте.

Чтобы установить фактический источник данных, вызовите [super setDatasource:self].

+0

Вы на самом деле правы! Это основной принцип подкласса, который я пропустил полностью. –

+0

Любая идея, как это делается в быстрой? –

Смежные вопросы