每当我创建一个IBAction时,我总是要将AnyObject的默认Type(sender)设置为唯一的另一个选项,即实际的类类型。
它是否有理由始终默认为AnyObject而不是我明确添加的对象?
我相信我理解UIObject和AnyObject之间的区别,但我不明白为什么AnyObject应该是默认值。
答案 0 :(得分:4)
实际上,您可以将IBAction
设置为该对象层次结构中的任何类。例如,如果您有一个名为YellowButton
的类是UIButton
的子类,那么您可以在AnyObject
,UIButton
和{{1}之间进行选择}。
要考虑的另一件事是,您可以将许多对象附加到同一YellowButton
。他们甚至不需要属于同一类型。例如,您可以将IBAction
和UIBarButtonItem
连接到同一UIButton
。只有在发件人类型设置为IBAction
时才能执行此操作。
现在,为什么Apple选择AnyObject作为我只能猜测的默认值。我认为这是因为您可以在方法中输入发送者,而不会丢失任何信息。这样,您甚至可以根据发件人的班级采取不同的行动。
答案 1 :(得分:4)
我能想到的一个原因是让我说我首先编写一个对象的接口,但我还不知道什么控件类型会调用该动作。或者更进一步,我最终得到了一种以上的控制。
通过默认为AnyObject,它非常适合objc id类型。它也是可扩展的,适用于一般情况。
它也是Target-Action的一部分,因此只有某些方法签名才能实现。
这个摘录提供了一个很好的方案 -
senderparameter通常标识发送操作消息的控件(尽管它可以是由实际发件人替换的另一个对象)。这背后的想法类似于明信片上的回邮地址。如果需要,目标可以查询发件人以获取更多信息。如果实际发送对象将另一个对象替换为发送方,则应以相同方式处理该对象。例如,假设您有一个文本字段,当用户输入文本时,将在目标中调用操作方法nameEntered:
- (void)nameEntered:(id) sender {
NSString *name = [sender stringValue];
if (![name isEqualToString:@""]) {
NSMutableArray *names = [self nameList];
[names addObject:name];
[sender setStringValue:@""];
}
}
此处,响应方法提取文本字段的内容,将字符串添加到作为实例变量缓存的数组,并清除该字段。对发送方的其他可能的查询是向NSMatrix对象询问其所选行([sender selectedRow]),向NSButton对象询问其状态([sender state]),并询问与控件关联的任何单元格的标签([ [sender cell] tag]),标签是数字标识符
默认为id / AnyObject是有意义的,因为您可以随时更改它以确保更好的类型安全。