1

2 つのプロパティを持つカテゴリを作成しましたが、1 つをデリゲートとして使用しようとすると問題が発生します。

    //  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];}

デリゲートは、アニメーション ブロックが完了した後の通知に使用されます。

    [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];}];

私の問題はdelegateForDropDown常に含まれていますnil。ブール値のプロパティは正常に機能するため、デリゲートのタイプが id であることに関係があると思われます

4

1 に答える 1

0

問題が見つかりました。私の側のプログラミングエラー。間違ったビューのデリゲート プロパティを設定していたので、問題は呼び出し元のクラスにありました。今はうまくいきます。TomSwift は私を正しい方向に向けてくれました。ありがとう。

于 2013-08-07T00:08:09.393 に答える