iphone - Utilice el método didSelectRowAtIndexPath o prepareForSegue para UITableView?
objective-c storyboard (6)
Cuando el remitente es UITableViewCell, puede solicitar a UITableView que consulte indexPath de la celda.
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
}
}
Estoy usando guiones gráficos y tengo una UITableView. Tengo una configuración de segue que empuja desde mi mesa al detalle VC. ¿Pero qué método debo usar para manejar esto? Tendré que pasar un par de objetos a la vista de detalle. ¿Pero uso didSelectRowAtIndex
o -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
?
Hice esto y funcionó
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Row Selected = %i",indexPath.row);
[self performSegueWithIdentifier:@"testID" sender:self.view];
}
Si la celda del remitente no es seleccionable, self.tableView.indexPathForSelectedRow
devuelve la celda seleccionada, pero no segue la celda del remitente. La mejor forma es obtener indexPath para el remitente segue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender];
}
En Swift:
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
(segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender)
}
Si usa prepareForSegue:
puede verificar quién es el remitente y ejecutar un código diferente
Por ejemplo, en forma rápida
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)
if senderIsTableviewCell
{
//do something
}
}
Si usa prepareForSegue:sender:
entonces no tendrá tanto que cambiar si más tarde decide desencadenar la segue de algún control fuera de la vista de tabla.
El prepareForSegue:sender:
se envía al controlador de vista actual, por lo que sugeriría algo como esto:
- (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];
}
En Swift:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let path = self.tableView.indexPathForSelectedRow()!
segue.destinationViewController.detail = self.detailForIndexPath(path)
}
si su propiedad tableView está en otra clase y usted solo tiene una sección , entonces podría usar la propiedad tag
para almacenar la fila de la celda como:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.tag = indexPath.row;
return cell;
}
Y luego puede acceder a él ya que el sender
es la misma celda con el valor de la fila en su etiqueta:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
MyDestinationViewController *destinationViewController = segue.destinationViewController;
destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell
}