2010-08-14 18 views
6

I wie gezeigt haben derzeit eine Schaltfläche definiert in einer Zelle und ein Verfahren seiner UITouchDown Aktion zu verfolgen:UITableView Cell - erhalten IndexPath.row von Button?

- (void) clickedCallSign:(id)sender { 

    int index = [sender tag]; 
    NSLog(@"event triggered %@",index); 

} 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Callsign button 
    UIButton *button; 

    CGRect rect = CGRectMake(TEXT_OFFSET_X, BORDER_WIDTH, LABEL_WIDTH, LABEL_HEIGHT); 
    button = [[UIButton alloc] initWithFrame:rect]; 
    cell.tag=[indexPath row]; 
    button.tag=[indexPath row]; 
    [button addTarget:self action:@selector(clickedCallSign:) forControlEvents:UIControlEventTouchDown]; 
    [button setBackgroundColor:[UIColor redColor]]; 
    [button setTitle:@"hello" forState:UIControlStateNormal]; 
    [cell.contentView addSubview:button]; 
    [button release]; 
} 

Jedoch, wenn ich eine Zelle im Simulator klicken, ist die Konsole Debug-Meldung: „Ereignis ausgelöst (null) "und meine App stürzt kurz darauf ab.

Wie kann ich den indexPath.row-Wert korrekt in meine clickedCallSign-Methode abrufen?

+0

Siehe bessere Lösung für indexPath aus gedrückten Taste zu finden: http://StackOverflow.com/a/16270198/308315 – iwasrobbed

Antwort

2

First off, index ist ein int, so dass Ihr NSLog muss wie folgt aussehen (beachten Sie die %d):

NSLog(@"event triggered %d", index); 

(Es ist möglich, dass dies zu einem Absturz führt, aber es ist auch wahrscheinlich, dass etwas ganz anderes wird, das die Instabilität verursacht.)

+0

Die '% d' hat den Trick gemacht, den Wert von indexPath.row in clickedCallSign zu bekommen :) Die App stürzt trotzdem ab .. mit diesem Stapel-Trace: - [ UIButton setText:]: nicht erkannter Selektor an Instanz 0x6877a10 gesendet 2010-08-13 21: 48: 30,324 RF [8047: 207] *** Ter Mining-App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '- [UIButton setText:]: unerkannter Selektor an Instanz 0x6877a10 gesendet' – unicornherder

+0

Wahrscheinlich hast du irgendwo etwas zu viel freigegeben. Die Speicherverwaltung in dem Code-Snippet, das Sie anzeigen, sieht gut aus, also ist etwas anderswo falsch. –

+1

eigentlich .. gefunden die Lösung, die ich hier brauchte: http://developer.apple.com/iphone/library/samplecode/Accessory/Introduction/Intro.html Danke für die Hilfe obwohl. Ich schätze es sehr. – unicornherder

2

Tag ist gut, bis Sie nicht beide Abschnitte und Zeilen haben. Versuchen Sie eine andere Art und Weise Indexpfad zu erhalten:

- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath { 

    //... 

    [button addTarget:self action:@selector(clickedCallSign:withEvent:) forControlEvents:UIControlEventTouchDown]; 

    //... 

} 

// Get the index path of the cell, where the button was pressed 
- (NSIndexPath*)indexPathForEvent:(id)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    return [self.tableView indexPathForRowAtPoint:currentTouchPosition]; 
} 

- (IBAction)clickedCallSign:(id)sender withEvent:(UIEvent*)event 
{ 
    NSIndexPath* buttonIndexPath = [self indexPathForEvent:event]; 
} 
2

Wenn Sie das Tag-Feld nicht verwenden wollen, müssen Sie die Taste aufrufen diese Methode:

- (void)tapAccessoryButton:(UIButton *)sender 
{ 
    UIView *parentView = sender.superview; 

    // the loop should take care of any changes in the view heirarchy, whether from 
    // changes we make or apple makes. 
    while (![parentView.class isSubclassOfClass:UITableViewCell.class]) 
     parentView = parentView.superview; 

    if ([parentView.class isSubclassOfClass:UITableViewCell.class]) { 
     UITableViewCell *cell = (UITableViewCell *) parentView; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
     [self tableView:self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath]; 
    } 
} 
Verwandte Themen