Secciones en una TableView


#1

Estoy tratando de agregar articulos de diferente precio a tableview que cuenta con 3 secciones, pero cuando se va agregar un articulo a una diferente sección de la inicial la app crashea mandándome este error. Alguien que me pueda ayudar por favor.


#2

Al parecer, al ingresar el dato al Array, lo está haciendo o intentando agregar en el índice 3 de ese Array, pero solo tiene un objeto ese Array tal vez si pintas cuántos objetos hay en ese Array cuando tienes la lista antes de ingresar otro dato puedas darte cuenta que está sucediendo, verifica en que Array vas a ingresar el dato


#3

tengo sólo un array, el cual estoy filtrando y dependiendo del filtro lo estoy mandando a cada sección, dejaré las captura.
No sé si mi lógica de lo que estoy tratando de hacer está bien.

ahí es el modelo de como se irán agregando los datos al array


#4

con un botón voy agregando a la tabla los articulos generados aleatoriamente


#6

El numero de scions y sus headers


#7

El numero de filas en cada sección


#8

Y por último como muestro los datos en cad a celda


#9

en cual de los tres array te marca el error?


#10

Depende del precio aleatorio que genere. Es decir si el primer precio aleatorio corresponde a la sección 1 y el siguiente será para la sección 2 pues me marca para la sección dos. Y así dependiendo cuál precio genere


#11

creo que ya se que puede ser… ok entendiendo lo que haces, cuando añades el dato… colocas lastIndex… y después usas un indexpath para indicar donde lo quieres…sin embargo creo que es mejor añadir el objeto usando el mismo array con append, el orden lo podrías filtrar en la el delegado de la celda… por ejemplo… si tienes el modelo…

let myArrayModelo = [MiModelo] ( )

y en el botón…
let miNuevoItem = MiModelo(parámetro: valorNuevo)
myArrayModelo.append(miNuevoItem)
y después el filtrado y al final el reloadData

Una Pequeña recomendación:::
para el filtrado de valores a mi manera de ver, ( es solo punto de vista personal tal vez alguien te de un mejor consejo que este ), es mejor crear una custom cell y hacerlo todo ahi… para que en el delgado no le estes cargando los procesos al recargar los datossobre todo en el cellForRow y así te evitas cargarle mucho proceso a la compilación,
así aplicando un poco de arquitectura MVC por ejemplo, la que mas te agrade, aparte de ser una buena practica tendrás todo mas cómodo para futuras modificaciones…

ahora: lo ajustas después de añadir tu item… y lo mandas al filtrado creo que puedes aquí usar map o el mismo filter que estas utilizando al retornarle el valor al respectivo array que creaste para los filtrados,… aqui es donde tienes que actualizar el dato únicamente para tu tipo de array… creo que se quieren añadir tres objetos por eso te dice que en el indice 3 no puedes añadirlo y el array solo tiene 1… por eso te sale el error… yo lo que haría sería colocar un break point para cada if, para verificar el comportamiento de la acción al agregar el item… así te darías cuenta con mas exactitud de lo que esta ocurriendo… en cada break point puedes o imprimir los items de cada array o usar “po” en consola… ejemplo: po miArrayCosas.count aunque prefiero usar el print a veces no hace caso el po en la consola…


#12

para hacer lo que te menciono en la customCell…
en la custom cel que tienes… creas una variable de cada modelo…

var miModelo: MiModeloCaro? {
didSet {
guard let modelo = miModelo else { return }
nombreLabel.text = modelo.nombre
precioLabel.text = modelo.precio + “.00”
}
}

después lo mismo pero con tu modelo medio y barato…

y en el delgado colocas unicamente

cell.miModelo = miArrayModeloCaro[indexpath.row]

para cada sección respectivamente


#13

creo que @Yan ya te dio una excelente solución justo te iba a proponer hacer un custom cell y hacer un método setupCell()

func setupCell(item:Cosa){
 labelNombre.text = item.nombre
 labelPrecio.text = "\(item.valorEnPesos).00"
 labelNumeroDeSerie.text = item.numeroDeSerie
}

Yo normalmente los uso así, porque finalmente sin importar de que array te alimentes todos son de tu modelo COSA entonces en el cellForRow puedes simplificar y no repetir código

para tu problema, me surge una duda si el objeto lo añades al array barato, medio o caro,
¿cual es la intencion de hacer el insertRow?
segun yo al hacer el reloadData del tableView, el cells forSection se actualizara y se mostraran uno u otro elemento por sección, asi realmente donde añades o quitas cosas es en los arrays y con el reloadData del tableView solo repintas la data.


#14

@Yan muchas gracias, por la ayuda, no había visto que me habías respondido, una disculpa.
@j05h de hecho ahorita me di cuenta de eso, que ya con el filtrado no necesitaba lo que estaba tratando de hacer, les comparto como lo implementé


#15

y en el cellForRowAt

y si debería evitar repetir código, crearé la función y solo la mandaré a llamar