2013-08-06 1 views
1

J'ai créé une catégorie avec 2 propriétés, mais j'ai un problème en essayant d'en utiliser une en tant que délégué.Utilisation d'un délégué dans une catégorie

// UIView+Dropdown.h 
    #import <UIKit/UIKit.h> 

    @protocol DropDownAnimationDoneDelegate <NSObject> 
    -(void) onDropDownAnimationDone:(id)sender; 
    @end 

    @interface UIView (Dropdown) 
    @property (strong, nonatomic) id <DropDownAnimationDoneDelegate> delegateForDropDown; 
    @property (nonatomic,assign) BOOL isDropped; 

    // UIView+Dropdown.m 
    #import "UIView+Dropdown.h" 
    #import <objc/runtime.h> 

    @implementation UIView (Dropdown) 
    -(void)setDelegateForDropDown:(id)ddDelegate{ 
     objc_setAssociatedObject(self, @selector(delegateForDropDown),ddDelegate,OBJC_ASSOCIATION_RETAIN_NONATOMIC);} 

    -(id)delegateForDropDown{ 
     return objc_getAssociatedObject(self, @selector(delegateForDropDown));} 

    -(void)setIsDropped:(BOOL)dropIt{ 
     objc_setAssociatedObject(self, @selector(isDropped), [NSNumber numberWithBool:dropIt], OBJC_ASSOCIATION_RETAIN_NONATOMIC);} 

    -(BOOL)isDropped{ 
     return [objc_getAssociatedObject(self, @selector(isDropped)) boolValue];} 

Le délégué sera utilisé pour la notification après un bloc d'animation est terminée:

[UIView animateWithDuration:0.75 
          delay:0.0 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{self.center = newCenter;} 
        completion:^(BOOL finished){ 
         if ([[self delegateForDropDown] respondsToSelector:@selector(onDropDownAnimationDone:)]) 
         [[self delegateForDropDown] onDropDownAnimationDone:self];}]; 

Mon problème est delegateForDropDown contient toujours nil. La propriété booléenne fonctionne correctement, donc je suppose que cela a quelque chose à voir avec le type de délégué en cours d'identification

+0

Qu'essayez-vous d'atteindre en utilisant ce hackage d'objets associés? –

+0

J'ai créé une sous-classe de vue qui se comporte comme une liste déroulante. Maintenant, je veux utiliser le comportement de l'animation sur d'autres vues (comme un UIButton), j'ai donc décidé de créer une catégorie à utiliser sur n'importe quelle vue. J'ai tout fonctionné sauf pour le notifié de l'achèvement de l'animation. – JVC

+0

vous ne montrez aucun paramètre de code delegateForDropdown sur self. mais je présume que vous faites cela? – TomSwift

Répondre

0

J'ai trouvé le problème. Erreur de programmation de ma part. Je définissais la propriété delegate pour la mauvaise vue de sorte que le problème était dans la classe appelante. Cela fonctionne bien maintenant. TomSwift m'a indiqué la bonne direction. Merci.

Questions connexes