Textfeld-Eingabe beschränken?

Altivec

Aktives Mitglied
Thread Starter
Mitglied seit
29.05.2006
Beiträge
1.301
Hallo Xcoder!

Ich sitze hier an einem kleinen Cocoa/ObjC Programm und komme gerade nicht weiter. In ein Textfeld soll ein Hex-Wert im Bereich "00"..."FF" eingegeben werden, also als Zeichenkette aus 2 Zeichen (aus der dann letztendlich ein unsigned char werden soll).
Nun soll der Benutzer aber keine Romane in das Textfeld schreiben können, sondern eben nur 2 Zeichen.
Fällt Euch dazu eine einfache Lösung ein?

Altivec
 

Gremlin

Mitglied
Mitglied seit
11.01.2006
Beiträge
764
Hallo,

Es wundert mich ein wenig, dass man bei einem NSTextField keine Beschränkung der Textlänge einstellen kann - ich würde das für eine relativ grundlegende Funktion halten.
Es läst sich aber machen, indem du einen Delegate für das Textfeld festlegst, der die controlTextDidChange Methode implementiert. Das könnte so aussehen:

Code:
- (void)controlTextDidChange:(NSNotification *)aNotification
{
	NSText		*editor = [textField currentEditor];
	NSString	*text = [[editor string] uppercaseString];
	NSMutableString *filteredText = [[NSMutableString alloc] initWithCapacity:2];
	for (int i = [text length] - 1; i >= 0; --i) {
		unichar ch = [text characterAtIndex:i];
		if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')) {
			[filteredText insertString:[NSString stringWithCharacters:&ch length:1] atIndex:0];
			if ([filteredText length] >= 2) 
				break;
		}
	}
	[editor setString:filteredText];
}
Diese Variante beschränkt nicht nur die Textlänge, sondern filtert auch alles ausser Ziffern und den Buchstaben A-F aus.

Gremlin
 

norbi

Aktives Mitglied
Mitglied seit
14.01.2003
Beiträge
3.516
Für so etwas nimmt man einen NSFormatter.

1) NSFormatter subclassen
2)
Code:
- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error
überschreiben. Dort wird bei jedem Tastendruck geprüft. Nett für den Benutzer, weil alles, was falsch ist, gleich beim Tastendruck gefiltert werden kann (siehe weiter unten).
In dieser Methode gibst Du YES zurück, wenn das Zeichen erlaubt ist, oder NO, wenn es nicht erlaubt ist.
3) in dieser Methode prüfst Du die Gültigkeit am besten mit einem Regex-Ausdruck
4) der so aussehen könnte:
RegexString anlegen:
Code:
NSString *regexTestString = [NSString stringWithFormat:@"[0F...]{2,2}";
Predicates könnten auch Regex-Prüfungen:
Code:
NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexTestString];
Die Regex-Prüfung durchführen
Code:
BOOL isOK = [regextest evaluateWithObject:partialString];
5) Feedback über eine Falscheingabe
Code:
*newString = nil; // Letzten Tastendruck ignorieren
NSBeep(); // Fehlersound abspielen
und wie gesagt, YES bei OK und NO bei nicht OK zurückgeben.

No.
 

Altivec

Aktives Mitglied
Thread Starter
Mitglied seit
29.05.2006
Beiträge
1.301
Hallo Gremlin und norbi!

Ihr habt mir sehr geholfen. Ich habe die erste Variante (controlTextDidChange) implementiert und es funktioniert einwandfrei :) Den zweiten Ansatz werde ich auch noch ausprobieren. Vielen Dank!

Gruß, Altivec
 

Diskordia

Mitglied
Mitglied seit
25.06.2004
Beiträge
441
Der zweite Ansatz is der bessere, weil das von den Apple Entwurfsmuster so vorgesehen ist.
 

anegmawad

Mitglied
Mitglied seit
12.04.2007
Beiträge
583
Hinsichtlich der Bewertung der Ansätze sehe ich das genau so. Für so etwas ist ein Number-Formatter erfunden worden.

-controlTextDidChange: erlaubt vor allem Aktionen auf Eingaben, ist also eher bezogen auf den Kontrollfluss (Notification, Delegate). Man kann übrigens Ähnliches mit dem Action-Target-Muster erreichen.
 
Oben