理解(id)发件人

时间:2012-12-14 11:47:26

标签: objective-c ios xcode

  

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

我对以下内容有一些疑问:

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

(UIButton)*sender究竟做了什么?我的意思是特别是带有*的(UIButton *)。它与UIButton *myButton类似吗?

据我所知,它是按下按钮的某种指针,但为什么会这样?为什么我不能写

_label.text = sender.titleLabel.text;

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

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

为了传递按钮的颜色?

3 个答案:

答案 0 :(得分:2)

(UIButton *)sender这是将您的id sender强制转换为UIButton。

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

答案 1 :(得分:1)

有时会收到类似“incompatible pointer type ....”或“incompatible conversion..”等的警告......这些都是由于类型转换中的错误而发生的。(id)是一种类型的施法者,可以处理类型转换(这里是按钮操作)...我希望你明白我的意思。

答案 2 :(得分:1)

你不能写

_label.text = sender.titleLabel.text;

因为sender的类型为id,而id对象没有任何proerty作为titleLabel,所以你必须先输入cast sender,这样编译器就知道这是一个UIButton类型的对象,它有一个名为titleLabel的属性。

现在,如果您想直接使用发件人,那么您必须确保该方法仅在按钮点击事件中被触发,然后按以下方式更改您的方法

- (IBAction)leftButtonPressed:(UIButton *)sender 

然后你可以直接使用

    _label.text = sender.titleLabel.text;