¿Cómo usar celdas estáticas en UITableView sin usar Storyboards?

Tengo un ViewController + xib existente en mi proyecto, y ahora quiero agregar un UITableView con celdas estáticas, como esta:

TableView con celdas estáticas

Pero cuando arrastro una UITableView en mi pantalla, no tengo el menú “Contenido> Estático” en el Inspector de Atributos.

Intenté hacer que mi controlador fuera la subclase UITableViewController, pero eso no ayuda, todavía no tengo la opción de usar celdas estáticas en Attributes Inspector.

He buscado en StackOverflow pero no he encontrado ninguna respuesta a esta pregunta. Todas las preguntas existentes se relacionan con Storyboards (que no estoy usando) en lugar de archivos xib.

Supongo que Xcode hace algún tipo de magia cuando agrega un UITableViewController a un guión gráfico, pero no cuando cambia un xib existente para heredarlo de UITableViewController.

¿Algún consejo sobre cómo agregar una vista de tabla con celdas estáticas a un xib existente?

Las celdas de vista de tabla estática solo están disponibles cuando se usan guiones gráficos. Sin embargo, si no está usando storyboards para toda su UI, puede usarlos para pantallas individuales en lugar de una colección de pantallas.

Para hacer esto, puede crear un archivo UIStoryboard con un solo controlador de vista en él que tenga su Propietario de archivo configurado en su subclase de controlador de vista personalizada. Establezca el identificador de VC en algún valor. Cuando desee mostrar esto, obtenga el guión gráfico y luego cree una instancia de la subclase del controlador de vista creando el CV de su guión gráfico.

UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil]; CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"]; 

Puede presentar este CV como de costumbre en su aplicación.

Esta es una gran manera de comenzar a usar storyboards sin tener que convertir toda su aplicación para usarlos.

Esto es factible sin guiones gráficos:

  1. su controlador debe adoptar protocolos para delegado de tabla vista y fuente … UITableViewDelegate, UITableViewDataSource
  2. Agregue una vista de tabla a su .xib; establecer el estilo de la vista de tabla a “agrupado”
  3. Conecte la tabla a una propiedad en su controlador (llamémoslo “yourTableView”)
  4. Agregue celdas de vista de tabla al .xib como vistas separadas … es decir, no como subvistas de la vista de tabla … serán flotantes libres en .xib. (ver imagen de ejemplo a continuación)
  5. Agregue controles / tags, etc. a las celdas de la tabla.
  6. Asigne cadenas únicas al campo “Identificador” en Atributos para cada celda de vista de tabla.
  7. Conecte las celdas de la tabla a otras propiedades en el controlador (sliderCell, switchCell, etc.)
  8. Conecte los eventos de envío para los controles de células a los métodos de IBAction-ed en el controlador – (IBAction) handleSliderCell, etc.
  9. En el método viewDidLoad de su controlador, asigne el delegado y el origen de la vista de tabla al controlador (self.yourTableControl.delegate = self; self.yourTableControl.dataSource = self;)
  10. implementar numberOfSectionsInTableView, numberOfRowsInSection y cellForRowAtIndexPath en el controlador
  11. en tableView: cellForRowAtIndexPath :, devuelve punteros YourFirstCell, yourSecondCell, etc. para obtener los valores de indexPath apropiados

Los eventos para los controles de las celdas de la tabla deben ir a las rutinas de su controlador …

Ejemplo para el paso 4: xib

Para ampliar la respuesta de BVB, cuando se trata del número 10, aquí están los fragmentos de Swift 3 para sus métodos delegates de tableview. Asegúrese de agregar salidas a todas sus celdas en el xib.

Cuando crea manualmente las secciones de la vista de tabla, recuerde que indexPath es igual a una matriz bidimensional que representa la estructura de su tabla. por ejemplo, cuando se pasa tableView(cellForRowAt indexPath: IndexPath) a tableView(cellForRowAt indexPath: IndexPath) es igual a [1][0] , su celda se colocará en la primera posición de la segunda sección.

Los valores se pueden extraer de indexPath con las propiedades indexPath.row y indexPath.section . Con estos valores, puede construir manualmente sus secciones desde sus IBOutlet en el orden que prefiera.

 @IBOutlet var is_enabled: UITableViewCell! @IBOutlet var is_public: UITableViewCell! func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { switch(section){ case 0: return "Cell 1" case 1: return "Cell 2" default: return "" } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } func numberOfSections(in tableView: UITableView) -> Int { return 2 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { print("index path here", indexPath) if(indexPath.section == 0) { return is_enabled } else if(indexPath.section == 1) { return is_public } else { return is_enabled } }