2010-08-14 4 views
6

Al momento ho un tasto definito in una cella e un metodo per monitorare la sua azione UITouchDown come mostrato:UITableView Cell - ottieni IndexPath.row dal pulsante?

- (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]; 
} 

Tuttavia quando si fa clic una cella nel simulatore, il messaggio console di debug è: "evento attivato (null) "e la mia app si blocca poco dopo.

Come posso ottenere il valore correttamente indexPath.row nel mio metodo clickedCallSign?

+0

vedere meglio la soluzione per la ricerca di indexPath dal tasto premuto: http://stackoverflow.com/a/16270198/308315 – iwasrobbed

risposta

2

Prima di tutto, index è un int, così il vostro NSLog deve assomigliare a questo (notare il %d):

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

(E 'possibile che questo porta ad un crash, ma è anche probabile che qualcosa di completamente sta che causa l'instabilità.)

+0

il '% d' ha fatto il trucco di ottenere il valore di indexPath.row nella clickedCallSign :) l'applicazione si blocca ancora però .. con questa analisi dello stack: - [ UIButton setText:]: selettore non riconosciuto inviato all'istanza 0x6877a10 2010-08-13 21: 48: 30,324 RF [8047: 207] *** Ter minating applicazione a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: '- [UIButton setText:]: selettore non riconosciuto inviato ad esempio 0x6877a10' – unicornherder

+0

Probabilmente sei over-releasing qualcosa da qualche parte. La gestione della memoria nello snippet di codice che hai mostrato sembra buona, quindi qualcosa altrove è sbagliato. –

+1

in realtà .. trovato la soluzione che avevo bisogno proprio qui: http://developer.apple.com/iphone/library/samplecode/Accessory/Introduction/Intro.html Grazie per l'aiuto però. Lo apprezzo molto. – unicornherder

2

Tag è buono fino a quando non si dispone di entrambe le sezioni e righe. Provare un altro modo per ottenere il percorso di indice:

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

Se non si desidera utilizzare il campo tag, hanno il pulsante di richiamare questo metodo:

- (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]; 
    } 
}