Frage

Ich bin neu in Objective-C, und ich habe viel Mühe, versucht, neue Zeilen in eine Tabelle hinzuzufügen. So wie es ist wohl zu arbeiten, ist, wenn der App lädt ein Alarm den Benutzer auffordert, erscheint, wenn sie möchten, um eine neue Konfiguration zu starten, eine gespeicherte Konfiguration laden, oder die letzte Konfiguration wieder aufnehmen. Nun, wenn sie eine neue Konfiguration starten wählen, werden sie gebeten, den neuen Namen zu geben, und wenn sie die App fertig tippen wird die neue Konfiguration in einer Tabelle gespeichert werden.

Im Moment kann ich nur die App nur eine Konfiguration in der Tabelle zu speichern, aber wenn der Benutzer versucht, wieder eine neue Konfiguration dann der App abstürzt zu machen. Hier ist, was mein Code wie folgt aussieht:

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

Ich habe viel über diese Dinge gelesen, aber dies scheint nicht, wie es zu schwer sein sollte. Auch glaube ich, dass das Hauptproblem ist, dass „Array“ nur einen Index hat, und wenn der Benutzer versucht, einen anderen hinzufügen, dass ist das, was die App abstürzen lässt.

Könnte jemand bitte helfen Sie mir und mir sagen, was ich tue, falsch und wie kann ich es richtig? Bitte! ... Oder vielleicht zeigen Sie mir gerade in die richtige Richtung?

War es hilfreich?

Lösung

Das Problem, wie Woofy erwähnt, ist, dass Sie jedes Mal ein neues Array erstellen, anstatt das zuvor erstellte Array von Grabbing. Also, das erste Mal, wenn Sie zu dem Array hinzufügen, werden Sie im Grunde tun:

[array insertObject:nameOfConfig AtIndex:0];

, aber das nächste Mal, erstellen Sie einen brandneuen (leer) Array und die configListDataIndex Variable ist nun 1, so rufen Sie

[array insertObject:nameOfConfig atIndex:1];

und Absturz, weil 1 ist außerhalb der Grenzen für ein leeres Array. Um dies zu lösen, können Sie so etwas wie tun:

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

Dann lassen Sie es nicht am Ende der Funktion (wie ich Ihre Getter für configListData annehmen werden Autoreleased oder Zuweisung).

Dies wird die Crasher beheben. Darüber hinaus können Sie immer einfach anrufen

[array addObject:nameOfConfig];

, die automatisch ein Objekt an das Ende des Arrays hinzugefügt, so dass Sie loswerden der Indexvariablen erhalten. Aber Sie sollten die Crasher zuerst beheben, als diesen zweiten Teil ändern, wird nur die Fehler verbergen, und machen es noch geheimnisvoll, dass die neue Konfiguration ersetzt nur die alten.

Andere Tipps

wäre es nicht viel einfacher sein NSMutableArray des -addObject zu verwenden: Methode anstelle von insert? warum soll man eine zusätzliche Variable (configListDataIndex) verwenden, wenn können Sie einfach verwenden addObject: nameOfConfig:

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

und das ist es.

Und ich glaube, ich weiß, warum es abstürzt ... Sie immer ein neues Array-Objekt erstellen und Sie jedes Mal einfügen „nameOfConfig“ an einer anderen Stelle in dem immer neuen leeren Array. Und aus diesem Grunde, configListData wird immer nur ein Objekt in ihm. Wäre es nicht viel besser sein configListData direkt zu bearbeiten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top