Подтвердить что ты не робот

Iphone - didSelectRowAtIndexPath: только вызывается после длительного нажатия на пользовательскую ячейку

Я создаю одно приложение на основе табличного представления. Я создал пользовательскую ячейку таблицы для таблицы, которая содержит 2 метки, 1 изображение и 1 кнопку. Метод представления данных в виде таблицы работает правильно. Я использую xib как для класса ячеек, так и для класса контроллера, и я подключаю делегат и источник данных к владельцу файла. Но проблема в том, что когда я выбираю строку таблицы, didSelectRowAtIndexPath не срабатывает. Как уже упоминалось, единственный способ стрельбы - удерживать камеру около 3-4 секунд. Кто-нибудь знает, почему это происходит?

Спасибо за любые указатели...

Вот мои методы просмотра таблицы.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [finalAddonsArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    NewCustomCell *cell = (NewCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NewCustomCell" owner:self options:nil];
        cell=[nib objectAtIndex:0];
    }

    Addons *addons1=[[Addons alloc]init];
    addons1= [finalAddonsArray objectAtIndex:indexPath.row];

    if (addons1.data == nil) {
        cell.ivCategory.image = [UIImage imageNamed:@"blogo.jpg"];
    }
    else
    {
        cell.ivCategory.image=[UIImage imageWithData:addons1.data];
    }

    cell.lblTitle.text = addons1.name;
    if (addons1.price == nil) {
        cell.lblPrice.text = nil;
    }
    else{
        cell.lblPrice.text = [NSString stringWithFormat:@"%@ rs",addons1.price];
    }
    [cell.button addTarget:self
                    action:@selector(editButtonPressed:)
          forControlEvents:UIControlEventTouchUpInside];

    cell.button.tag=indexPath.row;
    index = indexPath;
    cell.selectionStyle = UITableViewCellSelectionStyleGray;

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"sjcjksbcjksbcfkebscf1234567890");
}

Еще одна вещь, которую я получаю, если я использую UITableViewCell по умолчанию вместо пользовательской ячейки, то и моя проблема такая же, метод делегирования не срабатывает.

Пользовательские свойства ячейки:

enter image description hereenter image description here

4b9b3361

Ответ 1

Одна и та же проблема произошла со мной, потому что я добавил в нее признак распознавания жестов. Если вы использовали любой распознаватель жестов, попробуйте удалить его и проверить, не вызвало ли это проблему.

EDIT: решение, прокомментированное Али: Если вы использовали жестов tap, вы можете использовать [tap setCancelsTouchesInView:NO];

Ответ 2

Я столкнулся с аналогичной проблемой:

Для меня проблема заключалась в том, что мой UITableView был добавлен к UIScrollView и, более конкретно, к его contentView. Похоже, что внутри contentView мне пришлось нажать 2-3 секунды, чтобы запустить метод didSelectRowAtIndexPath.

Я переместил свой TableView на self.view вместо contentView, и он решил проблему!

Ответ 3

Возможно, вы вызовете метод

[tableView deselectRowAtIndexPath:indexPath animated:NO];

перед Push ViewController или другой операцией. Как

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // 1. manual call this method to deSelect Other Cell
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    // 2. than do other operation
    PushViewController Or Some Animation ....
}

это решает мою проблему.

Ответ 4

Дорогой я столкнулся с той же проблемой. Когда я постучал по ячейке, но didselectrowatindexpath не был вызван, как это было неожиданно вызвано, когда я отпустил кнопку после нажатия на нее в течение нескольких секунд.

Если вы столкнулись с одной и той же проблемой,  1. UITapGestureRecognizer, создающий проблему для вас                    или  2. вид прокрутки, в котором вы разместили представление таблицы.

Таким образом, вы должны удалить жест или представление суперпрокрутки, в котором находится ваш вид таблицы.

Ответ 5

Если у вас есть пользовательский объект жестов на вашем представлении, отметьте делегат override func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool. Сравните пользовательский жест с жестом отправителя, если его нестандартный объект жестов, передайте его супер. Таким образом, жесты/метки системы не будут заблокированы.

Ответ 6

Как и предлагали другие, [tap setCancelsTouchesInView:NO]; делает трюк. Однако я хочу прояснить одну вещь:

Если вы думаете, что не реализовали Tapgesture и вам интересно, почему вам пришлось добавить свое представление в защищенные представления, проверьте свой класс, потому что, скорее всего, вы унаследовали некоторый класс, и этот класс включает в себя распознаватель жестов касания.

В моем случае я сделал следующее:

- (NSMutableArray *)tapProtectedViews
{
    NSMutableArray *views = [super tapProtectedViews];
    [views addObject:self.mTableView];
    return views;
}

Ответ 7

Я не уверен в этом, но Delays Content Touches может иметь какое-то отношение к нему.