我在创建响应选择器不调用该方法的协议时遇到问题。也许有人能看出我哪里出错了。
查看我的代码:
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];
}
您的使用存在一些问题。正确的用法是以下代码;
- 首先,
self.delegate
可以执行由另一个符合该协议CHTumblrMenuDelegate
类实现的方法。 -
其次,必须由另一个类实现的
dismissView
方法。文件CHTumblrMenuView.h
或CHTumblrMenuView.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 委托;