web-dev-qa-db-fra.com

iphone - didSelectRowAtIndexPath: appelé uniquement après un appui long sur une cellule personnalisée

Je crée une application basée sur une vue de table. J'ai créé une cellule de tableau personnalisée pour tableau, qui contient 2 étiquettes, 1 image et 1 bouton. La méthode de source de données de la vue table fonctionne correctement. J'utilise xib pour les cellules personnalisées et la classe de contrôleur de vue et je connecte le délégué et la source de données au propriétaire du fichier. Mais le problème, c’est que lorsque je sélectionne la ligne du tableau, didSelectRowAtIndexPath n’est pas activé. Comme mentionné, la seule façon de tirer est de maintenir la cellule pendant environ 3-4 secondes. Quelqu'un at-il une idée de la raison pour laquelle cela se produit?

Merci pour tous les pointeurs ...

Voici mes méthodes de vue de table ..

- (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");
}

Une dernière chose que j'obtiens, c'est que si j'utilise par défaut UITableViewCell au lieu d'une cellule personnalisée, mon problème est identique, la méthode de délégation ne prend pas feu.

Propriétés de cellule personnalisées:

enter image description hereenter image description here

32
Anand Gautam

le même problème s’est produit avec moi car j’ai ajouté un dispositif de reconnaissance de gestes tactiles dessus . Si vous avez utilisé un dispositif de reconnaissance de mouvements, essayez de le supprimer et vérifiez s’il pose problème.

EDIT: Solution commentée par l'ALi: Si vous avez utilisé le toucher, vous pouvez utiliser [tap setCancelsTouchesInView:NO];

92
Mayank Agrawal

Peut-être appellerez-vous la méthode

[tableView deselectRowAtIndexPath:indexPath animated:NO];

avant Push ViewController ou autre opération. Comme

- (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 ....
}

ça résout mon problème.

2
Beyond Chao

J'ai été confronté à un problème similaire:

Pour moi, le problème vient du fait que ma UITableView a été ajoutée à une UIScrollView et plus précisément à sa contentView. Il semble qu'à l'intérieur de la contentView, j'ai dû rester appuyé pendant 2-3 secondes pour activer la méthode didSelectRowAtIndexPath.

J'ai déplacé mon TableView vers self.view au lieu de contentView et le problème a été résolu! 

2
Tib

Si vous avez un objet de geste personnalisé dans votre vue, cochez override func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool delegate. Comparez le geste personnalisé au geste de l'expéditeur. S'il n'est pas un objet de geste personnalisé, transmettez-le au super. Ainsi, les gestes/tapotements du système ne seront pas bloqués.

0
name-it

Cher j'ai rencontré le même problème. Lorsque j'ai tapé sur la cellule mais que didselectrowatindexpath n'était pas appelé, il a été appelé soudainement lorsque j'ai relâché le bouton après l'avoir appuyé pendant quelques secondes.

Si vous faites face au même problème, il doit y avoir un 1. UITapGestureRecognizer qui crée un problème pour vous ou 2. une vue de défilement dans laquelle vous avez placé votre vue de table.

Ainsi, vous devriez supprimer le geste ou la vue super défilement dans laquelle votre vue tableau est placée.

0
Bobby K

Comme d'autres l'ont suggéré, [tap setCancelsTouchesInView:NO]; fait l'affaire. Cependant, je tiens à préciser une chose:

Si vous pensez que vous n'avez pas implémenté tapgesture et que vous êtes curieux de savoir pourquoi vous avez dû ajouter votre vue dans les vues protégées, consultez votre classe, car vous avez probablement hérité d'une classe et cette classe contient un identificateur de gestes de frappe.

Dans mon cas, j'ai fait ce qui suit: 

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