it-swarm.com.de

Wie erhalte ich den indexPath eines UIButton in einer UITableViewCell?

Ich habe eine UITableview mit mehreren Zellen. In jeder Zelle füge ich Schaltflächen dynamisch entsprechend der Anzahl der Arrays hinzu. Wenn ich also auf eine Schaltfläche klicke, kann ich den Wert tag der Schaltfläche abrufen. Aber wie bekommt man die indexPath dieser Zelle?

Hier ist mein Code in -cellForRowAtIndexPath:

   UIView *view=(UIView*)[cell.contentView viewWithTag:indexPath.row+444];

   UIImageView *img=(UIImageView*)[cell.contentView viewWithTag:indexPath.row+999];
   img.image=[UIImage imageNamed:@"BHCS_empty.png"];

   if(integer!=50)
   {
        NSInteger y_axis=0;
        NSArray *Arr=[tableSubCategoryArr objectAtIndex:indexPath.row];
        img.image=[UIImage imageNamed:@"BHCS_selected.png"];

        view.Frame= CGRectMake(0,50,281, integer-50);
        for (int i=0; i<[Arr count]; i++)
        {
            NSLog(@"arr %@",[Arr objectAtIndex:i]);
            UIButton *Btn=[UIButton buttonWithType: UIButtonTypeCustom];
            Btn.frame=CGRectMake(0, y_axis, 281, 44);
            [Btn setImage:[UIImage imageNamed:@"BHCS_panel.png"] forState:UIControlStateNormal];
            [Btn addTarget:self action:@selector(subCategoryBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
            [Btn setTag:i+100];
            [view addSubview:Btn];


            UILabel *nameLbl=[[UILabel alloc]initWithFrame:CGRectMake(20, y_axis,248, 44)];
            nameLbl.text = [[Arr objectAtIndex:i]objectForKey:@"SubCategoryName"];
            nameLbl.textColor = [UIColor whiteColor];
            nameLbl.backgroundColor=[UIColor clearColor];
            panelTableView.separatorColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"BHCS_panel_div1.png"]];
            nameLbl.font = [UIFont fontWithName:@"Helvetica" size:12.0f];
            [view addSubview:nameLbl];

            y_axis=y_axis+44+1.3f;
        }
    }
11
user2230971

Vielen Dank an alle, die ich mit dem folgenden Code lösen

     NSIndexPath *indexPath = [panelTableView indexPathForCell:(UITableViewCell *)sender.superview.superview];

NSLog(@"%d",indexPath.row);
7
user2230971

Ich habe maximal gegebene Antworten ausprobiert, aber im Allgemeinen gehe ich für den allgemeinsten und idealsten Weg wie folgt vor:

 CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
 NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
27
Mrug

ALLLLL der Antworten hier sind schlecht und Sie sollten keine Superviews durchlaufen. Klassisches Beispiel, mit iOS 7 hat Apple die tableViewCell Hierarchie geändert und Ihre App stürzt jetzt ab!

Verwenden Sie dies stattdessen:

Wie man die UITableview-Zeilennummer kennt

12
CW0007007

Aktualisierte Antwort

Verwenden Sie es wie folgt:

CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; 
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];
8
Amit

Ich empfehle, Ihrer benutzerdefinierten UITableViewCell-Implementierungsklasse eine Eigenschaft hinzuzufügen, um den Indexpfad zu speichern. Wenn Ihr cellForRowAtIndexPath-Delegat in Ihrem TableViewController ausgelöst wird, legen Sie die indexPath-Eigenschaft für diese Zelle fest.

customTableViewCell.h:

@interface customTableViewCell : UITableViewCell

@property NSIndexPath *indexPath;

@end

customTableViewController Zelle konfigurieren:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    customTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath];
    // Do whatever you want with your cell
    cell.indexPath = indexPath;

    return cell;
}

Anschließend können Sie auf die Eigenschaft indexPath in Ihrer customTableViewCell verweisen, indem Sie self.indexPath aufrufen

0
CaseyC585

Keine dieser Antworten scheint eine sehr saubere Lösung zu sein. Die Art und Weise, wie ich dies implementieren würde, ist die Verwendung des Delegatenmusters. Der Ansichtscontroller ist der Stellvertreter der Zelle, dh Sie lassen die Zelle selbst den Tastendruck handhaben, und er teilt dem Stellvertreter mit, wann die Taste gedrückt wurde, damit er sie nach Belieben handhaben kann.

Angenommen, Sie haben eine Tabellenansicht, in der jede Zelle ein Objekt Person darstellt. Wenn Sie auf die Schaltfläche klicken, möchten Sie ein Profil für diese Person anzeigen. Alles, was Sie tun müssen, ist Folgendes:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customTableViewCell" forIndexPath:indexPath];
    cell.delegate = self;
    cell.person = self.people[indexPath.row];
    return cell;
}

- (void)personCell:(PersonCell *)personCell didPressButtonForPerson:(Person *)person {
    [self showProfileForPerson:person];
}

Anschließend müssen Sie in Ihrer Button-Klasse lediglich eine Eigenschaft namens buttonPressedHandler hinzufügen, die einen Block darstellt, der eine Instanz von Person zurückgibt. Wenn Sie Ihren Button erstellen und das Ziel hinzufügen, gehen Sie folgendermaßen vor:

- (void)viewDidLoad {
    [super viewDidLoad];

    // do whatever whatever else you need/want to here

    [self.button addTarget:self selector:@selector(handleButtonPressed) forState:UIControlStateNormal];
}

- (void)handleButtonPressed {
    // Make sure this is a required delegate method, or you check that your delegate responds to this selector first...
    [self.delegate personCell:self didPressButtonForPerson:self.person];
}
0
Mike

Fügen Sie diesen Code in die Aktionsmethode des Buttons ein:

NSIndexPath *indexPath = [yourtableviewname indexPathForCell:(UITableViewCell *)sender.superview];
   NSLog(@"%d",indexPath.row);
0
Balu