3

équipe,UITableView sélectionnée valeur indexPath donne mal

J'ai UITableView qui ont 50 ans et plus comptent cellules. largeur de chaque cellule est 60.

quand je défiler vers le haut à 20 cellules, puis appuyez sur une cellule

Sa donne la valeur de chemin d'index au-dessus de la valeur de la cellule cliquez pas sur la valeur de la cellule

intérieur cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    [[cell checkButton] addTarget:self action:@selector(checkButtonAction:) forControlEvents:UIControlEventTouchUpInside]; 

} 

    -(void)checkButtonAction:(id)sender 

    CGPoint touchPoint = [sender convertPoint:CGPointZero toView:self.tableview]; 

    NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:touchPoint]; 

    UIButton *button = (UIButton *)sender; 

} 

Si l'index sélectionné est 21 donne l'indice 20, le comptage d'index commence à partir de zéro.

La question a été observée dans iOS 10.1 iphone 7 plus périphérique, pas dans le simulateur iPhone 7 plus iOS 10.1 (14B72)

valeur Debugging {longueur = 2, path = 0-14}

NSIndexPath chemin doit être 0 - 15 mais il donne 0 - 14.

+0

essayer une fois par le remplacement de l'expéditeur ((UIButton *) expéditeur) au point de conversion; – appleBoy21

+0

si toujours le même problème, essayez une fois en suivant "[expéditeur convertPoint: CGPointZero toView: self.view]" – appleBoy21

+0

@kiran 'checkButtonAction:' est l'événement tactile de votre bouton? – Mahesh

Répondre

5
[YOURBUTTON addTarget:self action:@selector(METHODNAME:event:) forControlEvents:UIControlEventTouchDown]; 

cliquez sur le bouton méthode

-(IBAction)METHODNAME:(UIButton*)sender event:(id)event 
{ 

    NSSet *touches = [event allTouches]; 

    UITouch *touch = [touches anyObject]; 

    CGPoint currentTouchPosition = [touch locationInView:YOUR_TABLEVIEW]; 

    NSIndexPath *indexPath = [YOUR_TABLEVIEW indexPathForItemAtPoint: currentTouchPosition]; 
    // your requirement code 
} 

Si une requête sur ce code, puis mettre votre commentaire en réponse. Bonne chance

Happy Coding.

+0

NSSet * touches = [expéditeur allTouches]; UITouch * touch = [touche n'importe quel objet]; CGPoint currentTouchPosition = [emplacement tactileInView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; Son écrasé ne fonctionne pas. – kiran

+0

@kiran quel est votre problème? vous venez de commenter mon code dans votre code. –

+0

[UIButton allTouches]: sélecteur non reconnu envoyé à l'instance c'était mon journal de panne – kiran

1

Utilisez le code ci-dessous pour obtenir NSIndexPath en UIButton cliquez sur la méthode d'action et cela fonctionne très bien.

Essayez ci-dessous le code et vérifier:

-(void)checkButtonAction:(id)sender 

     UIButton *btn = (UIButton *)sender; 

     CGPoint origin = btn.frame.origin; 
     CGPoint touchPoint = [btn.superview convertPoint:origin toView:self.tableview]; 

     NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:touchPoint]; 

} 
+0

J'ai encore changé le même problème. – kiran

1

essayer ce premier donne le numéro d'étiquette à bouton cellForRowAtIndexPath Méthode

yourButton.tag = indexPath.row; 


[YOURBUTTON addTarget:self action:@selector(checkButtonAction:) forControlEvents:UIControlEventTouchUpInside] 

et l'opération d'extraction comme celui-ci

-(void)checkButtonAction:(id)sender 

    UIButton * button = (UIButton *)sender; 
    int indexPathOfCell = sender.tag; 
} 
+1

ajoutez également [YOURBUTTON addTarget: action de soi: @selector (checkButtonAction :) forControlEvents: UIControlEventTouchUpInside]; inside cellForRowAtIndexPath – appleBoy21

+1

FYI Dans ce cas, nous ne pourrons pas obtenir indexPath correct si la table a plus d'une section. – Mahesh

+1

@Mahesh - Oui complètement d'accord. Mais si le questionneur n'a qu'une seule section, ce sera le bon travail pour l'instant. – appleBoy21

1

Comme Mahesh a un problème avec une solution Gurinder Batth que son impossible d'obtenir les informations de section de indexPath. Donc, j'aimerais ajouter une réponse.

Créer une nouvelle classe d'objectif C héritant de UITableViewCell. Disons "MyTableViewCell"

modifier maintenant MyTableViewCell.h en créant IBOutlet de UIButton (par Ctrl + clic + de glisser UIButton à MyTableViewCell.h)

#import <UIKit/UIKit.h> 

@class MyTableViewCell; 
@protocol MyTableViewCellDelegate <NSObject> 
- (void)checkButtonClicked:(MyTableViewCell *)cell; 
@end 

@interface MyTableViewCell : UITableViewCell 

@property (weak, nonatomic) id <MyTableViewCellDelegate> delegate; 
@property (weak, nonatomic) IBOutlet UIButton *checkButton; 

@end 

Modifiez ensuite MyTableViewCell.m en créant IBAction de UIButton (par Ctrl + clic + de glisser UIButton à MyTableViewCell.m)

@implementation MyTableViewCell 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 
} 

- (IBAction)checkButtonAction:(id)sender { 
    [self.delegate checkButtonAction:self]; 
} 

@end 

ouvrez maintenant votre ViewController.m Fichier et mettre en œuvre le protocole que nous avons créé dans MyTableViewCell.h

@interface ViewController() <UITableViewDataSource, UITableViewDelegate, MyTableViewCellDelegate> 

@property (weak, nonatomic) IBOutlet UITableView *myTableView; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.view layoutIfNeeded]; 

    [self.myTableView setDataSource:self]; 
    [self.myTableView setDelegate:self]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyTableViewCell *myTableViewCell = [tableView dequeueReusableCellWithIdentifier:@"MyTableViewCell" forIndexPath:indexPath]; 

    [myTableViewCell setDelegate:self]; 

    return myTableViewCell; 
} 

#pragma mark - MyTableViewCellDelegate method 

- (void)checkButtonClicked:(MyTableViewCell *)cell { 
    NSIndexPath *indexPath = (NSIndexPath*)[self.myTableView indexPathForCell:cell]; 
    // Here access row using "indexPath.row" 
    // You can access section using "indexPath.section" 
} 

@end