How to fix error on handling PanGestureRecognizer

2019-07-11 03:18发布

问题:

I want to add PanGestureRecognizer to UIView of UIViewController. I'm dividing view on nine equal parts and create an UIViews by them. Also I added PanGestureRocgnizer on every part. When I call it in another class where I need it it works fine but when I touch on the screen in some part to start handle method for PangestureRecognizer I get the Error: [UIView handlePanGestureRocognizer:]: unrecognized selector sent to instance 0x17de2ee0. This is my code:

#import "CustomGestureRecognizer.h"

@implementation CustomGestureRecognizer
@synthesize arrayOfPatternsForComparison;
@synthesize arrayOfSubviews;
@synthesize arrayOfPanGestureRecognizers;



- (void)initialize:(UIView *)view {
    arrayOfPatternsForComparison = [[NSMutableArray alloc] init];
    arrayOfSubviews = [[NSMutableArray alloc] init];
    arrayOfPanGestureRecognizers = [[NSMutableArray alloc] init];

    [self createPatternsForComparison];
    [self splitScreenInParts:view];
    [self setPanGestrueRecognizersOnEveryPartOfTheScreen];
}

- (void)createPatternsForComparison {

}

- (void)splitScreenInParts:(UIView *)view {
    CGSize onePart = CGSizeMake(view.frame.size.width/3, view.frame.size.height/3);
    CGFloat x_positionOfPart = 0;
    CGFloat y_positionOfPart = 0;

    for (NSUInteger j=0; j<3; j++) {
        for (NSUInteger i=0; i<3; i++) {
            UIView *_view = [[UIView alloc] initWithFrame:CGRectMake(x_positionOfPart, y_positionOfPart, onePart.width, onePart.height)];

            [[_view layer] setBorderWidth:1.0];
            [[_view layer] setBorderColor:[UIColor redColor].CGColor];

            x_positionOfPart += onePart.width;
            [arrayOfSubviews addObject:_view];
            [view addSubview:_view];
        }
        y_positionOfPart += onePart.height;
        x_positionOfPart = 0;
    }

}

- (void)setPanGestrueRecognizersOnEveryPartOfTheScreen {
    for (UIView *view in arrayOfSubviews) {
        UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:view action:@selector(handlePanGestureRocognizer:)];
        [[panGestureRecognizer view] setTag:[arrayOfSubviews indexOfObject:view]];
        [view addGestureRecognizer:panGestureRecognizer];
    }
}


- (void)handlePanGestureRocognizer:(UIPanGestureRecognizer *)sender {
    NSLog(@"%d", [[sender view] tag]);
}



@end

and in another class of UIViewController I called it like this:

- (void)viewWillAppear:(BOOL)animated {
    CustomGestureRecognizer *cgr = [[CustomGestureRecognizer alloc] init];
    [cgr initialize:[self view]];
}

How to fix this? Thanks for your answers.

回答1:

Because cgr is released when you call it.

You have to create a var CustomGestureRecognizer *cgr in .h and then:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    cgr = [[CustomGestureRecognizer alloc] init];
    [cgr initialize:[self view]];
}

And then change this line

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:view action:@selector(handlePanGestureRocognizer:)];

to

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestureRocognizer:)];


回答2:

The problem is with this line.

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:view action:@selector(handlePanGestureRocognizer:)];

Here you are passing the target as "view" which is here a subview. The target should be a viewController object like "self" or any other viewController object.

And also here you are just creating 9 views (I think in NSObject subclass) and adding to an array, but those are not added to any view as sub views. For this you can return that array to your viewController, and there add pan gesture to those views with self as target. Then it'll work.



回答3:

I solved it by adding var *CustomGestureRecognizer cgr in .h of another class like anhtu said and change

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:view action:@selector(handlePanGestureRocognizer:)];

target to self like Dev said.