Pregunta

Soy nuevo en el objetivo-C y tengo muchos problemas para intentar agregar nuevas filas a una tabla. La forma en que se supone que funciona es, cuando la aplicación carga una alerta emergente preguntándole al usuario si desea, iniciar una nueva configuración, cargar una configuración guardada o reanudar la última configuración. Ahora, si seleccionan iniciar una nueva configuración, se les pedirá que ingresen el nuevo nombre y cuando toquen listo, la aplicación guardará la nueva configuración en una tabla.

En este momento solo puedo hacer que la aplicación almacene solo una configuración en la tabla, pero si el usuario intenta hacer otra configuración nueva, la aplicación se bloquea. Así es como se ve mi código:

- (IBAction) testToAddToList
{
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name

    NSMutableArray *array = [[NSMutableArray alloc] init];

    [array insertObject:nameOfConfig atIndex:configListDataIndex];

    self.configListData = array;

    [array release];

    configListDataIndex ++;
}

He estado leyendo mucho sobre estas cosas, pero no parece que sea demasiado difícil. También siento que el principal problema es que "array" solo tiene un índice y cuando el usuario intenta agregar otro, eso es lo que hace que la aplicación se bloquee.

¿Podría alguien ayudarme y decirme qué estoy haciendo mal y cómo puedo hacerlo bien? ¡Por favor! ... ¿O tal vez solo me señales en la dirección correcta?

¿Fue útil?

Solución

El problema, como menciona Woofy, es que está creando una nueva matriz cada vez, en lugar de tomar la matriz creada anteriormente. Entonces, la primera vez que agrega a la matriz, básicamente está haciendo:

[array insertObject:nameOfConfig AtIndex:0];

pero la próxima vez, crea una nueva matriz (vacía), y la variable configListDataIndex ahora es 1, por lo que llama

[array insertObject:nameOfConfig atIndex:1];

y bloquearse, porque 1 está fuera de límites para una matriz vacía. Para resolver esto, puede hacer algo como:

NSMutableArray *array;
if (self.configListData != nil)  // I know, unnecessary, but I like being explicit with my nil checks.
    array = self.configListData;
else
    array = [NSMutableArray array];

Entonces no lo libere al final de la función (ya que supongo que su getter para configListData se lanza automáticamente, o asignación).

Esto solucionará el bloqueo. Además, siempre puedes llamar

[array addObject:nameOfConfig];

que agrega automáticamente un objeto al final de la matriz, para que pueda deshacerse de la variable de índice. Pero primero debe solucionar el bloqueo, ya que cambiar esta segunda parte solo ocultará el error y hará que sea aún más misterioso que la nueva configuración simplemente reemplace a la anterior.

Otros consejos

¿no sería mucho más sencillo usar el método -addObject: NSMutableArray en lugar de insertObject? ¿Por qué molestarse en usar una variable adicional (configListDataIndex), cuando simplemente podría usar addObject: nameOfConfig:

[array addObject:nameOfConfig];
self.configListData = array;
[array release];

y eso es todo.

Y creo que sé por qué está fallando ... siempre creas un nuevo objeto de matriz, y cada vez que insertas " nameOfConfig " en una ubicación diferente en la siempre nueva matriz vacía. Y debido a eso, configListData siempre tendrá un solo objeto. ¿No sería mucho mejor editar configListData directamente?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top