Ejercicios de tablas (2,5 puntos)¶
Vamos a crear una pequeña aplicación en la que se muestre una tabla con una lista de datos y se puedan insertar y eliminar filas
Crear la interfaz (0,5 puntos)¶
Crea otra pantalla, al estilo de la que aparece en la figura. Tiene que tener los siguientes componentes:
- Un text field
- Un button con el texto "Insertar"
- Un table view
En el panel derecho de Xcode, selecciona lad propiedades adecuadas para que la tabla sea dinámica con un solo prototipo.
Importante: no te olvides de darle un identificador al prototipo, o cell identifier
.
.
En cuanto al layout:
- El campo de texto debe aparecer junto al botón en un stack view horizontal. El stack view debe aparecer a una distancia de 20 puntos de la parte superior de la pantalla y también de 20 puntos de los bordes izquierdo y derecho
- La parte superior de la tabla debe estar a una distancia de 20 puntos de la parte inferior del stack view y los otros tres bordes deben estar a 20 puntos de los bordes de la safe area.
Mostrar datos en la tabla (1 punto)¶
- Crea una clase Swift llamada
DSTabla
que va a hacer de datasource de la tabla seleccionándola. Recuerda que elDSTabla
debe heredar deNSObject
e implementar el protocoloUITableViewDataSource
- Conecta el
DSTabla
con la propiedaddataSource
de la tabla - El
DSTabla
va a almacenar los datos en una propiedadlista
de tipo array deString
(puedes usar los nombres que aparecen en el ejemplo u otros datos cualesquiera, es indiferente)
//en la clase DSTabla, definimos e inicializamos la propiedad
var lista = ["Daenerys Targaryen", "Jon Nieve", "Cersei Lannister", "Eddard Stark"]
- Ahora tendrás que implementar tú de manera adecuada los métodos:
tableView(_:, numberOfRowsInSection:)
recuerda que debe devolver el número de filas de la tablatableView(_:, cellForRowAt:)
: recuerda que debe devolver la celda para una fila determinada
De nuevo importante: en el método dequeReusableCell
que necesitas llamar dentro del cellForRowAt
, no te olvides de usar el mismo cell identifier
que le has puesto antes al prototipo.
Insertar filas (0,5 puntos)¶
Haz que al pulsar sobre el botón insertar se añada el texto a la lista de datos en la última posición (método append
del array) y luego añada visualmente la fila en la tabla (recuerda que es insertRows
del UITableView
).
Un parámetro del insertRows
es el IndexPath
de la celda. Puedes crear uno con el constructor IndexPath(row:, section:)
, pasándole el número de fila y sección. En nuestra tabla solo hay una sección, así que sería la 0.
Ten en cuenta que no necesitas el método
tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
ya que este lo llama iOS cuando pulsas en los iconos de eliminar o añadir celda, pero ahora lo estás haciendo con un botón propio. Solo necesitas insertar el dato en el array y la celda coninsertRows
.
Delegate (0,5 puntos)¶
Vamos a hacer que se puedan "marcar" filas de la tabla. Para ello necesitas algún objeto que actúe de delegate. Crea para ello una clase DelegateTabla
- Haz que esta clase herede de
NSObject
e implemente el protocoloUITableViewDelegate
- Implementa en esta clase un método similar al que hemos visto en clase que marca o desmarca una fila poniéndole un "checkmark", pero aquí cambiando el texto a color rojo (propiedad
textColor
aUIColor.red
) y si está en rojo pasando a negro.
Ahora vamos a conectar el delegate con la tabla gráficamente, en vez de por código, así practicamos esta manera de hacerlo. Para ello:
- Arrastrar un componente
Object
al árbol de componentes de la vista del storyboard con la pantalla del dispositivo (al árbol que aparece a la izquierda, no a la pantalla en sí). - Seleccionar el componente
Object
, y en elIdentity inspector
(cuarto icono del panel derecho de Xcode), escribir el nombre de la claseDelegateTabla
enCustom Class
. - Conectar tabla y delegate: seleccionamos la tabla con el ratón y vamos al
Connections inspector
(el último icono del panel derecho de Xcode). Arrastramos con el ratón (no hace faltaCtrl
) desde el círculo que representa aldelegate
hasta el icono del objeto que representa a la claseTablaDelegate
Una vez hecho esto, comprueba que funciona correctamente.