制作按钮时传递和使用选择器的问题

问题描述

我正在尝试在 Xcode 中进行一些编码,但在选择器方面遇到了一些问题。我创建了一个名为 NSButtonmodifiednSButton 子类。构造函数之一是

+ (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

我没有看到任何“不兼容的指针类型”警告。