Adicionando uma linha a uma tabela em Objective-C
-
22-07-2019 - |
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?
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?