Objective C警告:从不同的Objective-C类型传递'touchesForView:'的参数1

时间:2009-07-03 13:33:33

标签: iphone objective-c

我正在使用here中的一些代码来确定何时确定多点触控序列中的最后一根手指何时抬起。

以下是代码:

/*
Determining when the last finger in a multi-touch sequence has lifted
When you want to know when the last finger in a multi-touch sequence is lifted
from a view, compare the number of UITouch objects in the passed in set with the
number of touches for the view maintained by the passed-in UIEvent object.
For example:
*/

- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
        if ([touches count] == [[event touchesForView:self] count]) {
            // last finger has lifted....
        }
    }

我收到了警告:

  

passing argument 1 of 'touchesForView:' from distinct Objective-C type

代码构建并运行良好,但我想删除它,但不明白警告的含义。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

当您提供的类型与预期类型的​​对象不同时,会出现该特定警告。

在这种情况下,touchesForView:需要一个UIView对象,但您传递的是此代码中恰好出现self类型的对象。

为了使警告消失,您可以传递正确类型的对象,也可以强制编译器将self指针强制转换为正确的类型:

if ([touches count] == [[event touchesForView:(UIView *)self] count])

但请注意,如果self的行为与UIView不同,那么您可能会在未来遇到微妙的错误。

<强>更新

我做了一个快速搜索,找到this article,它有一些处理可可警告及其常见原因的优秀指南。

根据这些信息,我想快速列出您发布的代码应该发生的事情。我假设您使用Xcode中的模板创建了一个新的iPhone应用程序,并且该应用程序只有一个UIView(如Interface Builder中所示)。

要使用您发布的代码,您将创建一个自定义UIView子类,如下所示:

// YourViewClass.h:
@interface YourViewClass : UIView // Note #1
{
}
@end

// YourViewClass.m:

@import "YourViewClass.h" // Note #2

@implementation YourViewClass

- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    if ([touches count] == [[event touchesForView:self] count])
    {
        // last finger has lifted....
    }
}

@end

在Interface Builder中,您可以将view对象的类型设置为YourViewClass,然后就可以了。

根据我上面显示的代码,你不应该得到那个警告。这让我觉得上面的一个步骤没有做好。对于初学者,请确保:

  1. 您的self对象实际上是UIView子类(注意#1)
  2. #import源文件中的类标题(注释#2)