views:

1953

answers:

1

I'm using some code from here to determine when determining when the last finger in a multi-touch sequence has lifted.

Here's the code:

/*
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....
        }
    }

I'm getting the warning:

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

The code builds and runs fine, but I'd like to remove it but don't understand what the warning means. Any ideas?

+3  A: 

That particular warning comes up when you provide an object of a type that is different from the one that was expected.

In this case, touchesForView: expects a UIView object, but you are passing it an object of whatever type self happens to be in this code.

In order to make the warning go away, you can either pass an object of the correct type, or you can force the compiler to cast your self pointer to the correct type:

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

Be warned, however, that if self does not behave like a UIView, you could be setting yourself up for subtle errors down the road.

update:

I did a quick search, and found this article, which has some excellent guidelines for dealing with Cocoa warnings, and their common causes.

Based on that information, I want to quickly lay out what should be happening with the code you posted. I'm assuming that you created a new iPhone app using the template from Xcode, and that the application has a single UIView (as seen in Interface Builder).

To use the code you posted, you would created a custom UIView subclass as follows:

// 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

And in Interface Builder, you would set the type of the view object to YourViewClass, and then you should be good to go.

With the code laid out as I have shown above, you should not be getting that warning. This leads me to think that one of the steps above has not been done properly. For starters, be sure that:

  1. Your self object is actually a UIView subclass (note #1)
  2. You #import the header for your class in the source file (note #2)
e.James
Thank you so much for your time, the link and response! I'm actually not creating a new iPhone app and am in cocos2d (a game engine) land but I think that the next person that runs into a similar problem and reads this answer will save themselves a lot time :-) Thanks again!
Stu
You're welcome :)
e.James