Ошибка UITapGestureRecognizer при добавлении в изображение

Я использую UITapGestureRecognizer для обработки действий ImageviewTap. В основном ViewController он отлично работает. Но когда я использую другой ViewController в своем приложении и копирую тот же код UITapRecognizer, я получаю сообщение об ошибке EXC_BAD_ACCESS code = 1 address: 0x80759d3a в строку, когда я добавляю распознаватель в свое изображение. Что я не так?

Мой ImageView: работает

UIImageView *live;
live = [[UIImageView alloc]initWithFrame:CGRectMake(92, 230, 136, 100)];
live.image = [UIImage imageNamed:@"online.png"];
[live addSubview:onlineLabel2];
[live setUserInteractionEnabled:YES];
[self.view addSubview:live];
[super viewDidLoad];

и мой распознаватель жестов:

UITapGestureRecognizer *singleTaP3 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onlineTap:)];
singleTaP3.numberOfTapsRequired = 1;
singleTaP3.numberOfTouchesRequired = 1;    
[live addGestureRecognizer:singleTaP3];

и последняя строка я получаю сбой.


person tomeszmh    schedule 12.05.2013    source источник
comment
Во-первых, вы должны вызвать [super viewDidLoad]; сначала и после этого добавьте код.   -  person danypata    schedule 12.05.2013


Ответы (4)


Похоже, ваше живое представление не сохраняется, поэтому, когда вы пытаетесь добавить жест, представление больше не существует. Попробуйте записать свое живое представление как свойство интерфейса и синтезировать его в своей реализации.

person Franck    schedule 12.05.2013
comment
Не могли бы вы дать нам свой метод -(void)viewDidLoad и свой интерфейс? - person Franck; 12.05.2013
comment
Перед назначением _live вы объявляете локальную переменную live, которая перезаписывает вашу собственность в реальном времени. - person Matt G; 13.05.2013
comment
pastebin.com/4Zt64WCh Вот мой код! Я скопировал его в свой основной контроллер просмотра, и он отлично работает. - person tomeszmh; 13.05.2013

Я не уверен, что это приводит к сбою вашего кода, но вы должны позвонить

[super viewDidLoad]; 

в начале кода. (Если вы используете ARC, это выглядит нормально.)

[super viewDidLoad]; 
UIImageView *live;
live = [[UIImageView alloc]initWithFrame:CGRectMake(92, 230, 136, 100)];
live.image = [UIImage imageNamed:@"online.png"];
[live addSubview:onlineLabel2];
[live setUserInteractionEnabled:YES];
[self.view addSubview:live];
person Ankit Srivastava    schedule 12.05.2013
comment
Если вы используете ARC, вы должны объявить свое свойство следующим образом (сильное, не сохраняемое): @property (неатомарное, сильное) UIImageView *live; - person Franck; 12.05.2013
comment
Я установил свойство @property (неатомарное, сильное) UIImageView *live; и добавьте распознаватель жестов в _live, та же ошибка - person tomeszmh; 12.05.2013

Я тестирую следующее, и это работает. Интерфейс:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong, nonatomic) UIView *v;

- (void)tapAction;

@end

И реализация:

#import "ViewController.h"

@implementation ViewController

@synthesize v=_v;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _v = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];
    [_v setBackgroundColor:[UIColor redColor]];

    [self.view addSubview:_v];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
    tap.numberOfTouchesRequired = 1;
    tap.numberOfTapsRequired = 1;

    [_v addGestureRecognizer:tap];
}

- (void)tapAction
{
    NSLog(@"tap tap");
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
person Franck    schedule 12.05.2013

Моя проблема была в моем основном контроллере просмотра. Я неправильно назвал новый контроллер представления и получил для него нулевой указатель. Получите это в собственность, и это работает. Проблема не в распознавателе жестов.

person tomeszmh    schedule 13.05.2013