2011-11-15 3 views

risposta

194

Se si utilizza prepareForSegue:sender:, non si avranno più cambiamenti se in seguito si decide di attivare i passaggi da un controllo esterno alla vista tabella.

Il messaggio prepareForSegue:sender: viene inviato al controller della vista corrente, quindi mi piacerebbe suggerire qualcosa di simile:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Assume self.view is the table view 
    NSIndexPath *path = [self.tableView indexPathForSelectedRow]; 
    DetailObject *detail = [self detailForIndexPath:path]; 
    [segue.destinationViewController setDetail:detail]; 
} 

In Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let path = self.tableView.indexPathForSelectedRow()! 
    segue.destinationViewController.detail = self.detailForIndexPath(path) 
} 
+1

Ok, si può dare un esempio di come implementare con passaggio di un oggetto sulla base di indexPath. – Jon

+0

Ho aggiornato la mia risposta. –

+4

non dovrebbe 'self.view' essere semplicemente 'sender' qui? Non riuscivo nemmeno a far funzionare '[self.view indexPathForSelectedRow]', dovevo fare '[mittente indexPathForSelectedRow];' – ladookie

5

Ho fatto questo e ha funzionato

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    NSLog(@"Row Selected = %i",indexPath.row); 

    [self performSegueWithIdentifier:@"testID" sender:self.view];  
} 
+11

Questo non ha senso. È necessario utilizzare il seguito OR o il delegato della vista tabella. Basta creare un seguito dalla cella e eseguirà automaticamente la stessa cosa che hai fatto senza scrivere codice. – Yariv

+3

come si assegna un seguito a una cella senza didSelectRow? – Morkrom

0

Se si utilizza prepareForSegue: è possibile controllare chi è il mittente ed eseguire diversi c ode

Per esempio in rapida

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?) 
{ 
    var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell) 

    if senderIsTableviewCell 
    { 
     //do something 
    } 
} 
+2

Basta fare: * se lascia tableViewCell = mittente come?UITableViewCell {// fa qualcosa} *. Se il mittente non può essere trasmesso a UITableViewCell, "do something" non verrà eseguito. – mbeaty

1

se la vostra proprietà tableView è in un'altra classe e si avere solo una sezione, allora si potrebbe utilizzare la proprietà tag per memorizzare riga della cella come:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    cell.tag = indexPath.row; 

    return cell; 
} 

E poi si può accedere come l'sender è la stessa cella con il valore di riga nella sua tag:

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

    MyDestinationViewController *destinationViewController = segue.destinationViewController; 
    destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell 
} 
3

Quando il mittente è UITableViewCell, è possibile chiedere a UITableView di interrogare indexPath della cella.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let cell = sender as? UITableViewCell { 
      let indexPath = self.tableView.indexPathForCell(cell)! 
      assert(segue.destinationViewController.isKindOfClass(DetailViewController)) 
      let detailViewController = segue.destinationViewController as! DetailViewController 
      detailViewController.item = self.items[indexPath.row] // like this 
     } 
    } 
1

Se cellulare mittente non è selezionabile, self.tableView.indexPathForSelectedRow rendimenti selezionati cellulare, ma non Segue cellulare del mittente. Il modo migliore è sempre indexPath per segue mittente:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender]; 
} 

In Swift:

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
  
    (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender) 
}