2011-05-13 48 views
3

我想了解的Objective-C为iPhone开发的经历有关行动的例子,虽然我经常看到的东西,如:为什么(ID)发送的,而不是(的UIButton *)寄件人

- (IBAction)sliderMoved:(id)sender 
{ 
    UISlider *aSlider = (UISlider *)sender; 
    //rest of code goes here... 
} 

是什么接受类型(id)然后立即将其转换为(UISlider *)的目的。为什么不只是有以下几点:

- (IBAction)sliderMoved:(UISlider *)aSlider; 
{ 
    //rest of code goes here... 
} 

有没有技术原因,或者它只是约定,或为了可读性?

由于提前,

  • 蒂莫

回答

6

我认为这是一个约定,源于事实并不总是1:1的UIControl到IBAction的映射。例如,您可以将UISwitch,UIButton和UITextField全部映射到- (IBAction)syncUI:(id)sender;方法。在这种情况下,不可能指定类型。

我承认这只是我自己的心理理由,并且如果您可以的话,确实没有什么能够阻止您更加明确地表达发件人的类型。我通常是。

0

id是抽象的数据类型。如果你的方法可以从多个地方,另一个对象,通过一个按钮等被调用,那么你可能并不总是知道什么类型的对象正在发送方法调用。我认为这主要是约定,如果你要轮询发件人的数据,你必须知道它可以响应什么方法(如果不是,你可以问respondersToSelector :)。

2

IBActions通常是通用的,并且可以由任何类别触发,因此是id类型。如果你需要在你的方法中使用sender变量,那么显然你关心的是sender这个类,所以你应该改变方法签名以反映它。

3

实际上,如果您愿意,您可以指定发件人为UIButton*,并且您完全可以确定该行为永远不会被任何其他类型的对象触发。如果行动取决于发件人是特定类型,那甚至可能是适当的。但是,通常情况下,发件人的类型与控制器无关,并将其指定为id可让您灵活地更改视图而无需修改控制器。

即使您知道在应用程序中始终使用相应操作中的按钮,您也可能需要这种灵活性的一个原因是它使单元测试更容易。

相关问题