问题描述
我正在尝试在 Xcode 中进行一些编码,但在选择器方面遇到了一些问题。我创建了一个名为 NSButton
的 modifiednSButton
子类。构造函数之一是
+ (id)CreateButtonViewUsingObject:(id)targetobject selector:(SEL)select caption:(Nsstring *)label;
但是,我能够让它工作的唯一方法是将选择器作为 @selector(bleep:)
传递它可以工作但我收到消息
不兼容的指针类型将“Nsstring *”发送到“SEL”类型的参数
我认为这意味着 @selector(bleep:)
是作为 Nsstring
而不是 SEL
发送的。但是,它似乎有效,我不知道我是否做错了什么。我会将我的代码发布到我的 Git 中供人们查看,然后给出指向该位置的指针。
解决方法
首先,您确实应该遵循 Objective C 中的命名约定:
- 您的班级应命名为
ModifiedNSButton
,以大写字母开头 - 相反,函数应该以小写字母开头
那么,一个“构造函数”也应该遵循一些约定:
- 返回类型应该是
instancetype
,而不是id
- 如果是初始值设定项,则以
init...
开头(如initUsingObject...
) - 如果是类工厂,则以类的名称启动函数。
就您而言,您应该将其命名为
+ (instancetype) modifiedNSButtonUsingObject:(id)targetObject selector:(SEL)select caption:(NSString*)label
说了这么多,我看不出你的代码有问题:
@interface ModifiedNSButton : NSButton
@end
@implementation ModifiedNSButton
+ (instancetype)modifiedNSButtonUsingObject:(id)targetObject selector:(SEL)select caption:(NSString *)label {
return [self new];
}
- (void) handler {
}
- (void) handlerWithName:(NSString*)name andValue:(NSInteger)value {
}
- (void) test {
NSButton *b1 = [ModifiedNSButton modifiedNSButtonUsingObject:self selector:@selector(handler) caption:@"One"];
NSButton *b2 = [ModifiedNSButton modifiedNSButtonUsingObject:self selector:@selector(handlerWithName:andValue:) caption:@"Two"];
}
@end
我没有看到任何“不兼容的指针类型”警告。