Pergunta

Eu sou novo para Objective-C e eu estou tendo um monte de problemas para tentar adicionar novas linhas a uma tabela. A forma como é suposto trabalho é, quando as cargas de aplicativos um alerta aparece perguntando ao usuário se eles gostariam de, começar uma nova configuração, carregar uma configuração salva, ou retomar a última configuração. Agora, se eles selecionam iniciar uma nova configuração, eles serão convidados a entrar no novo nome e quando eles toque em Concluído o aplicativo irá salvar a nova configuração em uma tabela.

Agora eu só pode obter o aplicativo para armazenar apenas uma configuração na tabela, mas se o usuário tenta fazer uma outra nova configuração, em seguida, as falhas de aplicativos. Aqui está o que minha aparência código como:

- (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 ++;
}

Eu tenho lido muito sobre essas coisas, mas isso não parece que deve ser muito difícil. Também sinto que o principal problema é que "array" só tem um índice e quando o usuário tenta adicionar outro que é o que faz com que o app falha.

Poderia alguém por favor me ajude e me diga o que estou fazendo de errado e como eu posso fazer isso certo? Por favor! ... Ou talvez apenas me apontar na direção certa?

Foi útil?

Solução

O problema, como Woofy menciona, é que você está criando uma nova matriz de cada vez, em vez de agarrar a matriz criada anteriormente. Assim, a primeira vez que você adicionar para a matriz, você está basicamente fazendo:

[array insertObject:nameOfConfig AtIndex:0];

mas na próxima vez, você cria um novo array (vazio), ea variável configListDataIndex agora é 1, então você chama

[array insertObject:nameOfConfig atIndex:1];

e choque, porque é um fora dos limites para uma matriz vazia. Para resolver isso, você pode fazer 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];

Então não liberá-lo no final da função (como eu assumir o seu getter para configListData é autoreleased ou atribuição).

Isto irá corrigir o crasher. Além disso, você pode sempre chamar

[array addObject:nameOfConfig];

que adiciona automaticamente um objeto para o fim da matriz, assim você pode se livrar da variável índice. Mas você deve corrigir o crasher primeiro, como mudar esta segunda parte só vai esconder o erro, e torná-lo ainda mais misteriosa que a nova configuração apenas substitui o antigo.

Outras dicas

não seria muito mais simples de usar -addObject de NSMutableArray: método em vez de insertObject? por que se preocupar usando uma variável adicional (configListDataIndex), quando você poderia simplesmente usar addObject: nameOfConfig:

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

e é isso.

E eu acho que sei por que ele está falhando ... você sempre criar um novo objeto de matriz, e cada vez que você inserir "nameOfConfig" em um local diferente na sempre nova matriz vazia. E por causa disso, configListData sempre terá apenas um objeto na mesma. Não seria muito melhor para editar configListData diretamente?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top