Настройка UITapGestureRecognizer для пользовательского внутреннего цикла UIView

У меня есть контроллер представления, который содержит вложенные UIView. Я хотел бы добавить прослушиватель касаний для каждого добавляемого подпредставления. Но я поймал ошибку SIGABRT, когда нажимаю на подвид.

Вот мой код:

- (void) viewDidLoad {
    [super viewDidLoad];

    //set container
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(5, 5, 320, 420)];
    container.backgroundColor = [UIColor blueColor];

    //create new subview within container. I call it "card"
    for (int i=0; i<5; i++)
    {
        //create card
        UIView *card = [[UIView alloc] initWithFrame:CGRectMake(10, 35 + (65 * i), 300, 45)];
        card.backgroundColor = [UIColor greenColor];

        //set tap event with action selector = cardRowTapped
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped)];
        [card addGestureRecognizer:tap];

        //add subview
        [container addSubview:card];
    }

    //add subview to self
    [self.view addSubview:container];

}

и вот мой код обработчика крана

- (void) cardRowTapped:(UITapGestureRecognizer *)gr {
    NSLog( @"hello");
}

Вывод консоли:

03.10.2012, 13:23:37.173 MyProject[5167:707] -[MyViewController cardRowTapped]: нераспознанный селектор отправлен экземпляру 0x2cd810

2012-10-03 13:23:37.179 MyProject[5167:707] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[MyViewController cardRowTapped]: нераспознанный селектор отправлен в экземпляр 0x2cd810»

* Первый стек бросить вызов: (0x314b888f 0x377f6259 0x314bba9b 0x314ba915 0x31415650 0x30c45637 0x30bd5d65 0x30e06479 0x30b51f55 0x30b50aa3 0x30b5d7e9 0x30b5d627 0x30b5d1f5 0x30b43695 0x30b42f3b 0x3348922b 0x3148c523 0x3148c4c5 0x3148b313 0x3140e4a5 0x3140e36d 0x33488439 0x30b71cd5 0x76e8d 0x76e28) прекратить называется бросать исключение (lldb)

Любая идея, почему это происходит?


person Napri Irfan    schedule 03.10.2012    source источник
comment
Можете ли вы указать ошибку в консоли?   -  person Simha.IC    schedule 03.10.2012


Ответы (3)


для вашего метода требуется переменная-член, которая передается жестом, поэтому измените метод жеста касания, как показано ниже,

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped:)];

и проверьте, должно ли это работать, и еще одно, если вы не используете ARC, то освобождайте объекты после их использования.

person vishy    schedule 03.10.2012
comment
Спасибо. это работает. Вы спасли мою жизнь. но что означает : в cardRowTapped:? - person Napri Irfan; 03.10.2012
comment
если у ваших методов есть/требуются параметры, то в ваших селекторах вы должны указать : после имени метода. - person vishy; 03.10.2012

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

UIView *card = [[UIView alloc] initWithFrame:CGRectMake(10, 35 + (65 * i), 300, 45)];
        card.backgroundColor = [UIColor greenColor];

        //set tap event with action selector = cardRowTapped
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped:)];
        [tap setNumberOfTapsRequired:1];
        [tap setDelegate:self];
        [card addGestureRecognizer:tap];
        [tap release];
        //add subview
        [container addSubview:card];

и дайте делегату в файле .h, как показано ниже.

@interface ViewController : UIViewController<
UIGestureRecognizerDelegate>{
//.....
}

я надеюсь, что это поможет вам ...

:)

person Paras Joshi    schedule 03.10.2012
comment
Я все еще получаю ту же ошибку с этим, и я использую ARC. так что я не могу сделать [выпуск касанием]. но все равно спасибо - person Napri Irfan; 03.10.2012

Просто измените этот код:

//set tap event with action selector = cardRowTapped
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cardRowTapped:)];
        [card addGestureRecognizer:tap];

разница только в следующем:

@selector(cardRowTapped:)
if you have the method with parameter then ":" should be there.
person Simha.IC    schedule 03.10.2012