2012-06-14 8 views
28

Tengo una ViewController existente + xib en mi proyecto, y ahora quiero añadir un UITableView con células estáticas, así:¿Cómo usar celdas estáticas en UITableView sin utilizar Storyboards?

TableView with static cells

Pero cuando arrastra un UITableView en mi pantalla no lo hago tener el menú "Contenido> Estático" en el Inspector de Atributos.

He intentado hacer que mi controlador de la subclase UITableViewController, pero eso no ayuda, todavía no tengo la opción de utilizar 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?

Respuesta

43

Las celdas de vista de tabla estática solo están disponibles cuando se utilizan 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 único 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 esta CV como de costumbre en su aplicación.

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

+5

¿qué ocurre con el rendimiento en este caso? – mariusLAN

+1

no puede crear guión gráfico para iOS 4.3 o anteriores :( – tesmojones

22

Esto es factible sin guiones gráficos:

  1. su controlador debe adoptar protocolos para el delegado tableview y fuente ... UITableViewDelegate, UITableViewDataSource
  2. Agregar una vista de tabla a su .xib; establecer el estilo de la vista de tabla en "agrupado"
  3. Conectar la tabla a una propiedad en su controlador (llamémoslo "suTableView")
  4. Agregar celdas de vista de tabla a .xib como vistas separadas ... es decir. no como subvistas de la vista de tabla ... estarán flotando libremente en .xib. (Consulte la imagen de ejemplo a continuación)
  5. Agregue controles/etiquetas, etc. a las celdas de la tabla.
  6. Asigne cadenas únicas al campo "Identificador" en Atributos para cada celda de vista de tabla.
  7. conectar el celdas de la tabla a otras propiedades en el controlador (sliderCell, switchCell, etc)
  8. Conectar los eventos Enviar para los controles de las células para los métodos de IBAction-DE en el controlador - (IBAction) handleSliderCell, etc.
  9. En el método viewDidLoad de su controlador, asignar el delegado y la fuente de la vista de tabla al controlador (self.yourTableControl.delegate = Auto; self.yourTableControl.dataSource = auto;)
  10. implemento numberOfSectionsInTableView, numberOfRowsInSection, y cellForRowAtIndexPath en el controlador
  11. en tableView: cellForRowAtIndexPath :, volver yourFirstCell, yourSecondCell, etc punteros para indexPath los valores apropiados

de eventos para controles para las celdas de la tabla debe ir a sus rutinas de controlador ...

Ejemplo para el paso 4: xib

+1

¿Hay alguna ventaja de este enfoque si uno se acaba de orientación versiones de iOS, donde se apoyan los storyboards? – philwilks

+0

no funciona para mí. Consigo un ** No puede mostrarse la punta de ** paquete de error. y no se puede registrar un plumín de manera explícita porque no hay clases asociadas con las células creadas en el IB. subclases Así que acaba de crear de 'UITableViewCell' y los añadió a las células y lo intentó de nuevo, pero sigue sin suerte . el mismo error aparece – Isuru

+1

@philwilks -. la ventaja de este sobre guiones gráficos es que se obtiene beneficios de gestión de configuración de no utilizar guiones gráficos - por lo que si varios desarrolladores están actualizando la interfaz de usuario no vas a encontrar en un embrollo tal –

0

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

Al crear manualmente ver las secciones de mesa, recuerda que indexPath es igual a una matriz de 2 dimensiones que representa su estructura de la tabla. por ejemplo, cuando indexPath se pasa a tableView(cellForRowAt indexPath: IndexPath) es igual a [1][0], su celda se coloca en la primera posición de la segunda sección.

Los valores se pueden sacar 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 
    } 
} 
Cuestiones relacionadas