2012-11-22 2 views
5

Ho un problema con il pulsante accessorio UItableViewCell. Il mio pulsante accessorio è "connesso" con un seguito a un altro UIViewController. Quando tocco un pulsante accessorio, ottengo l'oggetto dal modello e "trasmetto" questo oggetto al successivo destinationViewController. Questa è la mia preparazione per il metodo segue:Ottieni IndexPath per il pulsante accessorio selezionato in UITableView

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"IdentityCard"]) 
    { 
     NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row); 
     [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.tableView.indexPathForSelectedRow.row]]; 
    } 
} 

Il problema è che il NSLog all'inizio del metodo (dopo il "se") mostrano sempre il numero 0! Ho cercato di implementare il metodo:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 

ma la preparazione per il metodo segue viene eseguito prima di questo metodo, quindi non si può impostare qualsiasi @property per "salvare" l'indexPath. Come posso risolvere questo problema?

risposta

1

ho risolvere il problema in questo modo: ho collegato l'UIViewController al destinationViewController (non dal pulsante ACCESSORIO ma dal UIViewController).

ho creato un @property nel primo View Controller:

@property (nonatomic) NSInteger indexPathRow; 

poi ho modificato il codice come questo:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"Disclosure Tapped----> %i" ,indexPath.row); 
    self.indexPathRow = indexPath.row; 
    [self performSegueWithIdentifier:@"IdentityCard" sender:self]; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"IdentityCard"]) 
    { 
     NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row); 
     [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.indexPathRow]]; 
    } 
} 

Ora funziona!

20

In:

- (void) prepareForSegue: (UIStoryboardSegue *) segue mittente: (id) sender

... hai il parametro 'mittente' che consente di conoscere la cella di l'accessorio che è stato TAPpato, quindi con:

index = [self.tableView indexPathForCell: sender] .row;

È possibile ottenere l'indice di esso per poterlo utilizzare.

Quindi non è necessario utilizzare il metodo tableView's accessButtonTappedForRowWithIndexPath.

+0

Grazie! In realtà non ho mai realizzato che il mittente si riempisse automaticamente con la cella. Ha un certo senso però: D – Fogmeister

0

@ soluzione di Andres è un lavoro per me, ma se voglio aggiungere il pulsante Aggiungi alla navigationbar e voglio mostrare la stessa viewcontroller con lo stesso identificativo segue poi index = [self.tableView indexPathForCell:sender].row; codice non funzionano perché il mittente non è sottoclasse di UITableViewCell. Così qui è la mia soluzione con il codice di @Andres:

- (void) addItem: (id) sender { 
    [self performSegueWithIdentifier: @"Identifier" sender: self]; 
} 

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender { 
    id selectedObject; 
    if (![[sender class] isSubclassOfClass: [UITableViewCell class]]) { 
     // create a new object 
     selectedObject = [...]; 
    } 
    else { 
     selectedObject = [objectArray objectAtIndex: [self.tableView indexPathForCell: sender].row]; 
    } 

    if ([[segue identifier] isEqualToString: @"Identifier"]) { 
     // use the new or existing object 
     [selectedObject doSonething]; 
    } 
}