Vista del contenedor iOS en UITableViewCell
iphone objective-c (4)
Haga su contenido de UITableViewController
como Static
.
Estoy tratando de agregar otro controlador de vista dentro de una celda UITableView. La idea es que toque la celda y se expanda para mostrar más contenido: una interfaz de mensajería. Es importante (creo) que esto está controlado por un Messaging ViewController separado.
Expandir la celda y tener vistas dentro de la celda expandirse con las restricciones adecuadas es realmente muy sencillo en los Storyboards, así que traté de mantener todo en los storyboards agregando mi nuevo VC a TableViewCell a través de un contenedor. De esa manera, podré agregar restricciones en la vista del contenedor y canalizar el contenido desde mi VC de mensajería.
Aquí está el error:
Configuración ilegal: las vistas de contenedor no se pueden colocar en elementos que se repiten en el tiempo de ejecución.
¿Hay alguna forma de solucionar este problema, o hay una manera en que pueda canalizar la vista desde mi controlador de vista a esta celda de visualización de tabla y hacer que se limite a una configuración que establezca en Guiones gráficos? ¡Gracias!
Poner vistas de contenedor en celdas de vista de tabla es demasiado pesado. Las celdas de vista de tabla deben ser livianas para que el usuario pueda desplazarse por ellas rápidamente. No es necesario colocar el controlador de vista completo en cada celda. La celda solo debe representar algunos de los datos de esa fila.
Cuando el usuario toca la celda, solo usa un segmento normal para el controlador de vista de mensajería. Su presentación será automática. Luego cree y especifique un control de animación para manejar la transición y hacer que aparezca como si la vista de composición del mensaje estuviera contenida dentro de la celda de vista de tabla.
Simplemente puede arrastrar la Vista del contenedor a UITableVeiw en el guión gráfico. Por ejemplo, puede arrastrarlo antes de la celda prototipo, y verá el controlador de vista de su contenedor antes de las celdas prototipo. Por cierto, puedes arrastrar cualquier elemento de la interfaz de usuario a la vista de tabla. No estoy seguro, cómo lidiar con la reproducción automática en la vista de tabla combinada + vista de contenedor, tal vez necesite calcular / establecer restricciones manualmente en el tiempo de ejecución. Actualizaré mi respuesta cuando encuentre la solución correcta para el autolayout.
Tuve la misma tarea y lo decidí de esta manera:
Paso 1. Crear la subclase MyCell: UITableViewCell
.
Paso 2. Si usa Self-Sizing Cells
dimensionamiento, en InterfaceBuilder agregue UIView a MyCell, luego agregue restricciones de altura y restricciones a todos los lados. Esta vista es necesaria para establecer la altura de la celda.
Si no, omita este paso y use heightForRowAtIndexPath
.
Paso 3. En MyCell.h, agregue una salida desde la restricción de altura de vista y la propiedad del controlador:
@interface MyCell: UITableViewCell
@property (weak, nonatomic) MessagingVC *controller;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;
@end
Paso 4. En cellForRowAtIndexPath
agrega el código:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];
// adjust this for your structure
cell.controller = [[UIStoryboard storyboardWithName:@"MessagingVC" bundle:nil] instantiateInitialViewController];
[self addChildViewController:cell.controller];
[cell.controller didMoveToParentViewController:self];
[cell.contentView addSubview:cell.controller.view];
// if you use Self-Sizing Cells
cell.viewHeight.constant = 200; // set your constant or calculate it
return cell;
}
Paso 5. Añade el método didEndDisplayingCell
:
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cell isKindOfClass:[MessagingVC class]])
[((MyCell*)cell).controller removeFromParentViewController];
}