Sto usando gli storyboard e ho un UITableView. Ho una configurazione successiva che spinge dal mio tavolo al dettaglio VC. Ma quale metodo dovrei usare per gestire questo? Dovrò passare un paio di oggetti alla vista di dettaglio. Ma io uso didSelectRowAtIndex
o -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
?Utilizzare didSelectRowAtIndexPath o preparare il metodo ForSegue per UITableView?
risposta
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)
}
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];
}
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
}
}
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
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
}
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
}
}
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)
}
Ok, si può dare un esempio di come implementare con passaggio di un oggetto sulla base di indexPath. – Jon
Ho aggiornato la mia risposta. –
non dovrebbe 'self.view' essere semplicemente 'sender' qui? Non riuscivo nemmeno a far funzionare '[self.view indexPathForSelectedRow]', dovevo fare '[mittente indexPathForSelectedRow];' – ladookie