我有一个小难题,正在把我推到墙上。我正在使用委托作为我正在编写的应用程序中的模式。我试图通过在每个委托调用中使用“[delegate respondsToSelector]”测试代理来尽可能地在调用委托的代码中“谨慎”。除非我在UIView子类中,否则一切正常。在这种情况下,respondsToSelector返回NO但我可以安全地调用委托代码,因此它存在且工作正常。
我把它归结为下面最简单的例子。您可以提供的任何帮助将不胜感激:
在我的UIView子类的.h文件中:
#import <UIKit/UIKit.h>
@protocol TestDelegate <NSObject>
@optional
-(double)GetLineWidth;
@end
@interface ViewSubclass : UIView {
id<TestDelegate> delegate;
}
@property (nonatomic, retain) id<TestDelegate> delegate;
@end
在我的委托类的.h文件中:
#import <Foundation/Foundation.h>
#import "ViewSubclass.h"
@interface ViewDelegate : NSObject <TestDelegate> {
}
@end
在我的委托类的.m文件中:
#import "ViewDelegate.h"
@implementation ViewDelegate
-(double)GetLineWidth {
return 25.0;
}
@end
在我的UIView子类的.m文件中:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
double lineWidth = 2.0;
if (delegate == nil) {
ViewDelegate *vd = [[ViewDelegate alloc]init];
delegate = vd;
}
// If I comment out the "if" statement and just call the delegate
// delegate directly, the call works!
if ([delegate respondsToSelector:@selector(GetLineWidth:)]) {
lineWidth = [delegate GetLineWidth];
}
CGContextSetLineWidth(context, lineWidth);
答案 0 :(得分:14)
-(double)GetLineWidth
的选择器为@selector(GetLineWidth)
。
你的选择器中有一个额外的冒号。
if ([delegate respondsToSelector:@selector(GetLineWidth:)]) {
^
答案 1 :(得分:3)
将 if-statement 替换为:
if ([delegate respondsToSelector:@selector(GetLineWidth)]) {
lineWidth = [delegate GetLineWidth];
}