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
?Utilice el método didSelectRowAtIndexPath o prepareForSegue para UITableView?
Respuesta
Si usa prepareForSegue:sender:
, entonces no tendrá tanto que cambiar si más tarde decide desencadenar la transición desde algún control fuera de la vista de tabla.
prepareForSegue:sender:
El mensaje se envía al controlador de vista actual, por lo que te sugiero 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)
}
lo hice y funcionó
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Row Selected = %i",indexPath.row);
[self performSegueWithIdentifier:@"testID" sender:self.view];
}
Si usa prepareForSegue:
puede verificar quién es el remitente y ejecutar diferentes c oda
Por ejemplo, en rápida
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)
if senderIsTableviewCell
{
//do something
}
}
Simplemente hazlo: * if let tableViewCell = sender as?UITableViewCell {// hacer algo} *. Si el remitente no puede enviarse a una UITableViewCell, "no hacer algo" no se ejecutará. – mbeaty
si su propiedad tableView está en otra clase y que sólo tienen una sección de, entonces usted podría utilizar 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 entonces se puede acceder a él como 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
}
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
}
}
Si celular remitente no es seleccionable, self.tableView.indexPathForSelectedRow
rendimientos seleccionados celular, pero no segue celular remitente. La mejor manera es conseguir 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)
}
- 1. UITableView DidSelectRowAtIndexPath?
- 2. en iOS, ¿Por qué ocurre antes de prepareForSegue didSelectRowAtIndexPath
- 3. Al editar, `UITableView` no llama a didSelectRowAtIndexPath ??
- 4. Barra de búsqueda con prepareForSegue para DetailViewController
- 5. prepareForSegue no se llamó cuando se seleccionó la fila UITableView?
- 6. Cómo llamar al método didSelectRowAtIndexPath con UITapGestureRecognizer?
- 7. UITableView didSelectRowAtIndexPath no ser llamado en primer grifo
- 8. iPhone: didSelectRowAtIndexPath no invocado
- 9. UITableView didSelectRowAtIndexPath agregar marca de verificación adicional al tocar
- 10. Utilice el método Boolean.valueOf() vs (o el autoboxing de Java 1.5) para crear objetos booleanos
- 11. didSelectRowAtIndexPath devuelve un error IndexPath
- 12. Utilice comilla simple o comilla doble para cadenas en EL
- 13. Utilice delegados asincrónicos o ThreadPool.QueueUserWorkItem para el paralelismo masivo?
- 14. Configurando correctamente willSelectRowAtIndexPath y didSelectRowAtIndexPath para enviar selecciones de celda
- 15. Segue no llamando a prepareForSegue
- 16. prepareForSegue y delegados
- 17. Utilice el método de formulario DELETE en Html.BeginForm()?
- 18. iPhone: modifique una celda seleccionada en didSelectRowAtIndexPath
- 19. Personalizado UITableViewCell no llamando a prepareForSegue
- 20. ¿Hay un punto de interceptación como prepareForSegue para TabBarController?
- 21. Utilice siempre el localizador para git diff
- 22. No utilice el valor predeterminado para el doble
- 23. ¿Cómo "presionar" programáticamente una celda UITableView?
- 24. Conflicto UITapGestureRecognizer en UIView y para UITableView
- 25. Utilice Arquillian para probar EJB seguro
- 26. método delegado UITableView llamado dos veces
- 27. Distinguiendo entre didSelectRowAtIndexPath y accessoryButtonTappedForRowWithIndexPath
- 28. Problemas para pasar indexPath.row con prepareForSegue con UISearchBar
- 29. Toques de manejoComience en UITableViewCell deshabilita didSelectRowAtIndexPath
- 30. UITableview - tableView: didDeselectRowAtIndexPath: ¿el método no funciona correctamente?
Ok, ¿Puede dar un ejemplo de cómo implementarlo con el paso de un objeto basado en indexPath. – Jon
He actualizado mi respuesta. –
no debería 'self.view' ser simplemente' remitente' aquí? Ni siquiera pude hacer que '[self.view indexPathForSelectedRow]' funcionara, tuve que hacer '[sender indexPathForSelectedRow];' – ladookie