多种方法命名为' tag'发现

时间:2012-01-11 10:06:49

标签: iphone objective-c ios xcode

为什么我在下面的代码中收到此警告:

- (IBAction)shareThisActionSheet:(id)sender
{
    int row = [sender tag]; //warning is here! Multiple methods named 'tag' found
    ...

3 个答案:

答案 0 :(得分:13)

<强>描述

问题是编译器在当前转换单元中看到多个名为tag的方法,并且这些声明具有不同的返回类型。一个可能是-[UIView tag],返回NSInteger。但它也看到tag的另一个宣言,也许是:

@interface MONDate
- (NSString *)tag;
@end

然后编译器看到歧义 - senderUIView?还是MONDate

编译器警告你必须猜测 sender的类型是什么。这确实是在询问未定义的行为。

解决

如果您知道参数的类型,请指定它:

- (IBAction)shareThisActionSheet:(id)sender
{
 UIView * senderView = sender;
 int row = [senderView tag];
 ...

否则,使用诸如isKindOfClass:条件之类的东西来确定在传递变量之前声明变量的类型。正如其他答案所示,你也可以进行类型转换。

答案 1 :(得分:4)

问题是sender被定义为(id)个对象。在编译时,xcode不知道将哪种对象传递给您的函数。

如果您为特定对象类型编写此函数,您可以编写例如

- (IBAction)shareThisActionSheet:(UIButton*)sender

或者您可以通过调用

提示编译器对象的类型
int row = [(UIButton*)sender tag]; 

答案 2 :(得分:2)

巴斯蒂安是对的,你应该将发件人转换成这样的按钮:

UIButton * button = (UIButton *)sender;
int row = button.tag;