【问题标题】:Understanding (id)sender [duplicate]了解(id)发件人[重复]
【发布时间】:2012-12-14 20:09:23
【问题描述】:

可能重复:
Objective C: what is a “(id) sender”?

我对以下问题有一些疑问:

- (IBAction)leftButtonPressed:(id)sender 
{
     UIButton *button = (UIButton*)sender;
     _label.text = button.titleLabel.text;
}

(UIButton)*sender 到底是做什么的?我的意思是特别是带有 *.是不是类似于UIButton *myButton

据我了解,它是某种指向被按下按钮的指针,但这是为什么呢?为什么我不能写

_label.text = sender.titleLabel.text;

因为它“是”按钮?我怎么知道可以发送什么?我的意思是我可以写类似的东西:

-(void)leftButtonPressed:(color)sender {...}

为了传递按钮的颜色?

【问题讨论】:

标签: objective-c ios xcode


【解决方案1】:

(UIButton *)sender 这是将您的id sender 类型转换为 UIButton。

是的,你可以写 -(void)leftButtonPressed:(color)sender {...} 但是颜色应该是一个有效的类类型,它应该是像 -(void)leftButtonPressed:(NSColor *)sender {...} 这样的指针

【讨论】:

    【解决方案2】:

    有时您会收到诸如“incompatible pointer type ....”或“incompatible conversion..”之类的警告...这些是由于类型转换中的错误而发生的。(id) 就是这样一种可以处理类型转换的类型转换(此处为按钮行动)...我希望你明白我的意思。

    【讨论】:

      【解决方案3】:

      你不会写

      _label.text = sender.titleLabel.text;
      

      因为 sender 是 id 类型,并且 id 对象没有任何作为 titleLabel 的属性,所以您必须首先输入 cast sender 以便编译器知道这是一个 UIButton 类型的对象,它具有名为 titleLabel 的属性。

      现在,如果您想直接使用 sender,则必须确保该方法仅在按钮单击事件时触发,然后按以下方式更改您的方法

      - (IBAction)leftButtonPressed:(UIButton *)sender 
      

      那么你可以直接使用

          _label.text = sender.titleLabel.text;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-20
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 2012-04-12
        相关资源
        最近更新 更多