在这种情况下,协议确实响应选择器对我不起作用



我在创建响应选择器不调用该方法的协议时遇到问题。也许有人能看出我哪里出错了。

查看我的代码:

Protocol.h

#import <UIKit/UIKit.h>
@protocol CHTumblrMenuDelegate <NSObject>
@required
- (void)dismissView;
@end
typedef void (^CHTumblrMenuViewSelectedBlock)(void);
@interface CHTumblrMenuView : UIView<UIGestureRecognizerDelegate,CHTumblrMenuDelegate>{
    id<CHTumblrMenuDelegate>delegate;
}
@property (nonatomic, weak) id<CHTumblrMenuDelegate> delegate;

Protocol.m

- (id)initWithFrame:(CGRect)frame{
     self = [super initWithFrame:frame];
if (self) {
    // Initialization code
    UITapGestureRecognizer *ges = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss:)];
    ges.delegate = self;
    [self addGestureRecognizer:ges];
    self.backgroundColor = [UIColor clearColor];
    backgroundView_ = [[UIImageView alloc] initWithFrame:self.bounds];
    //backgroundView_.backgroundColor = TumblrBlue;
    backgroundView_.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    UIGraphicsBeginImageContext(backgroundView_.frame.size);
    [[UIImage imageNamed:@"background"] drawInRect:backgroundView_.bounds];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    backgroundView_.backgroundColor = [UIColor colorWithPatternImage:image];
    [self addSubview:backgroundView_];
    buttons_ = [[NSMutableArray alloc] initWithCapacity:6];

}
return self;
}
- (void)dismiss:(id)sender{
    NSLog(@"DIS");
    if (delegate == nil) {
       CHTumblrMenuView *vd = [[CHTumblrMenuView alloc]init];
       delegate = vd;
    }
    [delegate respondsToSelector:@selector(dismissView)];
    [self dropAnimation];
    double delayInSeconds = CHTumblrMenuViewAnimationTime  + CHTumblrMenuViewAnimationInterval * (buttons_.count + 1);
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self removeFromSuperview];
});
}

ClassUseProtocol.m

CHTumblrMenuView *menuView = [[CHTumblrMenuView alloc] init];
menuView.delegate = self;
-(void)dismissView{
    NSLog(@"DismissView");
}

日志: 2016-06-06 22:44:07.258 ProtocolExample[7513:4030481] DIS

有谁知道会发生什么?

你没有对respondsToSelector的结果做任何事情 - 这将返回一个布尔值,指示对象是否响应指定的选择器。 如果它返回 true,那么您应该调用委托方法:-

if ([delegate respondsToSelector:@selector(dismissView)]) {
    [delegate dismissView];
}

您的使用存在一些问题。正确的用法是以下代码;

  1. 首先,self.delegate可以执行由另一个符合该协议CHTumblrMenuDelegate类实现的方法。
  2. 其次,必须由另一个类实现的dismissView方法。文件CHTumblrMenuView.hCHTumblrMenuView.m是实现协议CHTumblrMenuDelegate和必须实现的方法。

    if ([self.delegate respondsToSelector:@selector(dismissView)]) {
           [self.delegate dismissView];
    }
    

    @interface CHTumblrMenuView : NSObject@end

    @implementation CHTumblrMenuView-(无效)解雇视图{ NSLog(@"dismissView");}@end

你的协议方法是@required,所以不需要检查

 delegate respondsToSelector:@selector(dismissView)

在使用取消定义 dismissView 方法的情况下,您将获得编译时错误。你可以在下面行

 if (self.delegate && [self.delegate conformsToProtocol:@protocol(CHTumblrMenuDelegate)]) {
    [self.delegate dismissView];
 }

你有双重定义委托

@interface CHTumblrMenuView : UIView<UIGestureRecognizerDelegate,CHTumblrMenuDelegate>

@property(非原子、弱)id 委托;

最新更新