How to fix error on handling PanGestureRecognizer

2019-07-11 03:34发布

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.

3条回答
趁早两清
2楼-- · 2019-07-11 03:42

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:)];
查看更多
Bombasti
3楼-- · 2019-07-11 04:04

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.

查看更多
Rolldiameter
4楼-- · 2019-07-11 04:05

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.

查看更多
登录 后发表回答