2016-09-15 2 views
1

I a créé une sous-classe de UICollectionView et dans cette sous-classe je veux override setters de dataSource et delegate propriétés.délégué Override et setters DataSource dans la sous-classe UICollectionView

Il utilise d'autres propriétés segmentSelectionDelegate et segmentDataSource (qui peuvent être définies par l'appelant) pour remplir les données. Je souhaite interdire la définition des propriétés dataSource originales et des propriétés déléguées par l'appelant, car la sous-classe elle-même est la source de données et le délégué.

Comment puis-je faire cela?

Ci-dessous est ce que j'ai fait, mais il génère une erreur: La source de données n'est pas définie.

fichier d'interface:

@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 

I synthétisé délégué et propriétés dataSource dans UICollectionView sous-classe:

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

A écrit setters comme:

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

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

Répondre

3

Ce que vous avez fait en synthétisant les propriétés en votre sous-classe crée de nouvelles variables d'instance. Lorsque le code de la superclasse vérifie si la source de données est définie, la réponse est non, car sa variable d'instance est toujours nil. Supprimez les instructions de synthèse, car vous allez implémenter le setter de toute façon (et vous n'avez pas besoin de fournir un getter).

Dans votre setter prioritaire, ne faites rien.

Pour définir la source de données réelle, appelez [super setDatasource:self].

+0

Vous avez raison! C'est le principe de base du sous-classement que j'ai complètement raté. –

+0

Une idée de comment cela se fait dans swift? –