Question

Je suis nouveau sur Objective-C et j'ai beaucoup de difficulté à essayer d'ajouter de nouvelles lignes à un tableau. La façon dont cela est supposé fonctionner est que, lorsque l'application charge une alerte, demandant à l'utilisateur s'il le souhaite, de démarrer une nouvelle configuration, de charger une configuration enregistrée ou de reprendre la dernière configuration. Maintenant, s’ils sélectionnent démarrer une nouvelle configuration, il leur sera demandé de saisir le nouveau nom et, une fois l’application terminée, l’application enregistrera la nouvelle configuration dans un tableau.

À l'heure actuelle, l'application ne peut stocker qu'une seule configuration dans le tableau, mais si l'utilisateur tente de créer une nouvelle configuration, l'application se bloque. Voici à quoi ressemble mon code:

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

J'ai beaucoup lu sur ce sujet, mais cela ne semble pas devoir être trop difficile. De plus, j’estime que le problème principal est que " array " n’a qu’un seul index et lorsque l’utilisateur tente d’en ajouter un autre, c’est ce qui provoque le blocage de l’application.

Quelqu'un pourrait-il m'aider s'il vous plaît et me dire ce que je fais mal et comment je peux le faire correctement? S'il vous plaît! ... Ou peut-être juste me diriger dans la bonne direction?

Était-ce utile?

La solution

Le problème, comme le mentionne Woofy, est que vous créez un nouveau tableau à chaque fois, au lieu de récupérer le tableau créé précédemment. Donc, la première fois que vous ajoutez au tableau, vous faites essentiellement:

[array insertObject:nameOfConfig AtIndex:0];

mais la prochaine fois, vous créez un nouveau tableau (vide) et la variable configListDataIndex vaut 1, vous appelez donc

[array insertObject:nameOfConfig atIndex:1];

et planter, car 1 est hors limites pour un tableau vide. Pour résoudre ce problème, vous pouvez faire quelque chose comme:

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];

Alors ne le relâchez pas à la fin de la fonction (car je suppose que votre getter pour configListData est auto-libéré, ou une affectation).

Ceci corrigera le crash. De plus, vous pouvez toujours appeler

[array addObject:nameOfConfig];

qui ajoute automatiquement un objet à la fin du tableau afin que vous puissiez vous débarrasser de la variable d'index. Mais vous devriez réparer le crash tout d’abord, car changer cette seconde partie ne fera que cacher le bogue et rendre encore plus mystérieux le fait que la nouvelle configuration remplace simplement l’ancienne.

Autres conseils

Ne serait-il pas beaucoup plus simple d'utiliser la méthode -addObject: de NSMutableArray au lieu de insertObject? pourquoi utiliser une variable supplémentaire (configListDataIndex), alors que vous pourriez simplement utiliser addObject: nameOfConfig:

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

et c'est tout.

Et je pense comprendre pourquoi il se bloque ... vous créez toujours un nouvel objet de tableau et insérez à chaque fois "nameOfConfig". à un emplacement différent dans le tableau toujours nouveau vide. Et à cause de cela, configListData n'aura toujours qu'un seul objet. Ne vaudrait-il pas mieux modifier directement configListData?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top