为什么我在下面的代码中收到此警告:
- (IBAction)shareThisActionSheet:(id)sender
{
int row = [sender tag]; //warning is here! Multiple methods named 'tag' found
...
答案 0 :(得分:13)
<强>描述强>
问题是编译器在当前转换单元中看到多个名为tag
的方法,并且这些声明具有不同的返回类型。一个可能是-[UIView tag]
,返回NSInteger
。但它也看到tag
的另一个宣言,也许是:
@interface MONDate
- (NSString *)tag;
@end
然后编译器看到歧义 - sender
和UIView
?还是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;