Ziel-C - Entfernen Sie das letzte Zeichen aus der Zeichenfolge

151

Wie würde ich in Objective-C für iOS das letzte Zeichen einer Zeichenfolge mithilfe einer Schaltflächenaktion entfernen?

Omar
quelle

Antworten:

418

Erstellen Sie in Ihrer Controller-Klasse eine Aktionsmethode, mit der Sie die Schaltfläche in Interface Builder verbinden. Innerhalb dieser Methode können Sie Ihre Saite wie folgt kürzen:


if ([string length] > 0) {
    string = [string substringToIndex:[string length] - 1];
} else {
    //no characters to delete... attempting to do so will result in a crash
}






Wenn Sie eine ausgefallene Methode in nur einer Codezeile suchen, können Sie diese wie folgt schreiben:

string = [string substringToIndex:string.length-(string.length>0)];

* Erklärung der Phantasie einzeiligen Code - Schnipsel:

Wenn es ein Zeichen zu löschen ist (dh die Länge der Zeichenfolge größer als 0)
     (string.length>0)kehrt 1 somit den Code Rückkehr zu machen:
          string = [string substringToIndex:string.length-1];

Wenn es kein Zeichen (dh die Länge der löschen ist Zeichenfolge ist NICHT größer als 0) gibt
     (string.length>0)zurück, 0 wodurch der Code zurückgegeben wird:
          string = [string substringToIndex:string.length-0];
     Dies verhindert Abstürze.

Marc Charbonneau
quelle
8
Ihre Lösung hat einen Fehler von 1. Es sollte [string substringToIndex: [string length] - 1] sein;
Jim Correia
Bezieht sich "string" auf "string.text" oder nur auf den Stringnamen
Omar
Danke Jim, es war wohl zu früh am Morgen, um zu rechnen. :) Omar, Zeichenfolge bezieht sich auf eine Variable namens Zeichenfolge, die den Text enthält, den Sie ändern möchten. In der Dokumentation finden Sie verschiedene Möglichkeiten, wie Sie ein NSString-Objekt erstellen können, entweder aus einer Datei auf der Festplatte oder aus Daten in Ihrer Anwendung.
Marc Charbonneau
1
@DonalRafferty stellen Sie sicher, dass Ihre Zeichenfolge nicht Null ist
quantumpotato
Es ist in Ordnung, wenn der String null ist. Wenn Sie eine Methode aufrufen, die einen ganzzahligen Wert zurückgibt, wird in Obj-C 0 zurückgegeben (beachten Sie, dass dies NICHT für Gleitkomma-Rückgabewerte gilt). Die if-Anweisung entspricht also dem Fragen string != nil && [string length] > 0. Es besteht die Möglichkeit, dass Donals String-Variable über freigegeben wird.
Marc Charbonneau
53

Wenn es sich um einen NSMutableString handelt (den ich empfehlen würde, da Sie ihn dynamisch ändern), können Sie Folgendes verwenden:

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];
Dave DeLong
quelle
8

Die hier angegebenen Lösungen berücksichtigen tatsächlich keine Mehrbyte-Unicode-Zeichen ("zusammengesetzte Zeichen") und können zu ungültigen Unicode-Zeichenfolgen führen.

Tatsächlich enthält die iOS-Headerdatei, die die Deklaration von substringToIndexenthält, den folgenden Kommentar:

Hinweis: Mit rangeOfComposedCharacterSequencesForRange verwenden: um zu vermeiden, dass zusammengesetzte Zeichen getrennt werden

Hier erfahren Sie, wie SierangeOfComposedCharacterSequenceAtIndex: das letzte Zeichen korrekt löschen.

user1071136
quelle
6

Die Dokumentation ist dein Freund, NSStringunterstützt einen Aufruf substringWithRange, der die Zeichenfolge verkürzen kann, die du hast, um die verkürzte Zeichenfolge zurückzugeben. Sie können eine Instanz nicht ändern, die NSStringunveränderlich ist. Wenn Sie eine NSMutableStringis haben, wird eine Methode aufgerufen deleteCharactersInRange, mit der die Zeichenfolge geändert werden kann

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...
Harald Scheirich
quelle
1
Mit NSMakeRange kann das Ausfüllen einer Bereichsstruktur manchmal etwas eleganter aussehen.
Dreamlax
@Harald, substringWithRange:gibt a zurück NSString*. Beachten Sie den Zeiger.
Thomas Nadin