【问题标题】:Problems passing and using selectors when making buttons制作按钮时传递和使用选择器的问题
【发布时间】:2021-02-14 18:59:06
【问题描述】:

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

+ (id)CreateButtonViewUsingObject:(id)targetObject  selector:(SEL)select caption:(NSString *)label;

但是,我能够让它工作的唯一方法是将选择器传递为@selector(bleep:) 它可以工作,但我收到了消息

不兼容的指针类型将“NSString *”发送到“SEL”类型的参数

我假设这意味着@selector(bleep:)NSString 而不是SEL 的形式发送。但是,它似乎有效,我不知道我是否做错了什么。我会将我的代码发布到我的 Git 上供人们查看,然后提供指向该位置的指针。

【问题讨论】:

  • 请在问题中发布minimal reproducible example
  • CreateButtonViewUsingObject:selector:caption:buttonWithTitle:target:action: 做的一样吗?

标签: objective-c callback selector nsbutton


【解决方案1】:

首先,您确实应该遵循 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

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

【讨论】:

  • 感谢您的帮助。由于 ARC 之类的原因,语言似乎发生了变化,而我用于编码的一些文档似乎使用了不同年份的语法。我将按照您的建议重做代码。此刻只剩下一点混乱。为什么从按钮接收消息的对象为零?如果它适用于同一个对象,则 nil 是合适的。 (而不是自己)坦率地说,自 IBM/370 和 VAX/VMS 以来,手册的质量和清晰度似乎一直在下降。
  • 关于nil——这只是一些示例代码,最好是self。我会改变这个。
  • NSButton 可以处理handlerhandlerWithName:andValue: 操作吗?操作不应该是action message吗?
  • 非常感谢 Andreas Oetjen 的帮助。我浏览了您的示例并将其与代码中的各个位置进行了比较,现在我编写的部分工作正常。
猜你喜欢
  • 2014-06-14
  • 2020-10-22
  • 1970-01-01
  • 2020-07-13
  • 2014-12-08
  • 2019-10-25
  • 1970-01-01
  • 2015-12-25
  • 2013-11-17
相关资源
最近更新 更多