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:
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];
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.
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!
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.
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.
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;
}