【问题标题】:Why does an IBAction's sender type have to be id?为什么 IBAction 的发件人类型必须是 id?
【发布时间】:2016-07-10 03:23:44
【问题描述】:

我正在通过“Mac OS X 的 Cocoa 编程(Objective-C 版)”学习 Cocoa,每当我使用 Interface Builder 创建一个按钮时,我都必须将它与我目前正在工作的类之一连接起来与。

当我控制从按钮单击拖动到我的 AppDelegate.h 文件时,Xcode 会自动将按钮挂钩到我的 AppDelegate 类。如果我选择“Action”,它将创建一个这样的方法:

- (IBAction)onButtonPress:(id)sender {
}

Objective-C 的方法是这样工作的:

- (returnType)methodName:(typeOfFirstArgument)firstArgumentName (typeOfSecondeArgument)secondArgumentName

为什么我必须为发件人使用类型id 而不是NSButton?我知道我用一个按钮连接了这个方法。因此,我希望发件人是NSButton 类型的对象。

我试过了,但是没用。

【问题讨论】:

    标签: objective-c macos cocoa ibaction nsbutton


    【解决方案1】:

    答案:它不一定是 id,如果您查看弹出的小对话框,在其中选择“Action”并命名处理程序,您会看到您可以选择对象的实际类型,NSButton在你的例子中。

    【讨论】:

      【解决方案2】:

      类型不必是id。您绝对可以在创建连接时使用弹出窗口或在代码中更改参数的类型和名称。

      id 是一种类型,意思是“指向任何 ObjC 对象的指针”。指向特定类的指针也可以:

      - (IBAction)onButtonPress:(NSButton *)importantButton;
      

      【讨论】:

      • 对于语言新手来说,这里的一个关键细节是id 是一个通用的指针,所以当你替换它时,你需要使用类似NSButton *不是 NSButton.
      • 呃!我不知道。您能否提供一个示例,为什么您会使用 id 而不是您期望的不同类型?
      • 只有当您期望不同的对象调用此方法并且需要将自己传入 @user148013 时,您才会使用 id。或者,如果您根本不关心发件人。
      • 我不同意这里所说的一些内容。 id 应该是操作的默认选择,原因很简单,它建立了一个更通用和灵活的界面。如果您声明发件人为NSButton*,则表示仅允许NSButtons 调用此操作。如果您稍后决定要一个NSMenuItem,例如,也调用该操作,您实际上必须更改对象的接口以允许它。坏的。除非您有特定的理由要求特定类别的发件人,否则不要这样做。 Objective-C 应该比这更有活力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多