Falsche Nutzereingaben in NSTableView verhindern

  • Falsche Nutzereingaben in NSTableView verhindern

    Hallo,

    hier eine kleine Anfängerfrage:
    Ich habe einen NSTableView. In einer bestimmten Spalte will ich verhindern, daß der Nutzer Blanks(' ') und Slashes('/') eingeben kann. Wie mach ich das am besten? Habe bereits versucht, NSTextFieldCell setAllowedInputSourceLocales zu verwenden, indem ich der Methode einen Array gesponsert habe mit den erlaubten Werten.

    a.) Das hat leider nicht geklappt. Man konnte weiterhin alle Werte eingeben.
    b.) Weiß auch nicht, ob der Weg mit setAllowed... so gut ist. Eigentlich will ich ja nur zwei Werte ausschließen, ansonsten aber alles zulassen, was das Dateisytem so versteht.

    Fragen:
    - Was versteht denn das Dateisystem? Ist das Unicode fähig? Falls nicht: Wie stell ich sicher, dass nur solche Sachen eingegeben werden, die das Dateisystem auch versteht?
    - Wie würdet ihr generell eine Überprüfung einer Nutzereingabe bei einem NSTableView implementieren?

    Über ein paar Tips wäre ich sehr dankbar.
    Danke!
  • RE: Falsche Nutzereingaben in NSTableView verhindern

    Original von O. Siemoneit
    a.) Das hat leider nicht geklappt. Man konnte weiterhin alle Werte eingeben.
    b.) Weiß auch nicht, ob der Weg mit setAllowed... so gut ist. Eigentlich will ich ja nur zwei Werte ausschließen, ansonsten aber alles zulassen, was das Dateisytem so versteht.

    Fragen:
    - Was versteht denn das Dateisystem? Ist das Unicode fähig? Falls nicht: Wie stell ich sicher, dass nur solche Sachen eingegeben werden, die das Dateisystem auch versteht?
    - Wie würdet ihr generell eine Überprüfung einer Nutzereingabe bei einem NSTableView implementieren?


    a) Ja, eingeben darf man was man will. Obs gültig ist interessiert erst beim Sichern der Daten.
    Zumindest glaube ich, dass es so war.
    b) Nee, ist er definitiv nicht. Bestes Beispiel: du willst Ziffern aus deiner Zeile im TableView lesen. Also nutzt du dein setAllowed und sagst ihm, dass nur Ziffern eingegeben werden. Du gibst diese Ansammlung von Ziffern dann an einen AppController weiter und der fliegt dir um die Ohren, weil es nämlich immer noch ein Text ist.

    - Dem kannst du einen vom Pferd erzählen, es versteht das. Sogar Unicode.
    - NSFormatter.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • RE: Falsche Nutzereingaben in NSTableView verhindern

    Eigentlich verbietet man nicht das Tippen, sondern die Übernahme der Eingabe. So etwa bei numerischen Feldern oder im Finder. Ich weiß insofern nicht genau, was du mit "Eingabe" meinst.

    Du kannst bei der Übernahme den Wert validieren.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Danke Tom9811 für den Tip!

    Habe es jetzt so gemacht:

    Quellcode

    1. - (void)tableView:(NSTableView*)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn*)aTableColumn row:(int)rowIndex {
    2. //First Column
    3. if ([[aTableColumn identifier] isEqualToString:@"first column"]) {
    4. .....
    5. }
    6. //Second Column
    7. else {
    8. NSRange range = [anObject rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:[NSString stringWithString:@" /"]]];
    9. if (range.location == NSNotFound)
    10. [locations replaceScriptAtIndex:rowIndex withObject:anObject];
    11. else {
    12. NSMutableString *errorString = [NSMutableString string];
    13. [errorString appendFormat:NSLocalizedString(@"The abbreviated designation \"%@\" is not allowed.",@""), anObject];
    14. NSRunAlertPanel(errorString,
    15. NSLocalizedString(@"Try another designation without blanks and slashes.",@""),
    16. NSLocalizedString(@"OK",@""), nil, nil);
    17. }
    18. }
    19. //Save userprefs
    20. [locations synchronize];
    21. }
    Alles anzeigen


    Das tut's jetzt für mich. An den NSFormatter trau ich mich erst bei meinem nächsten Projekt ;) Sah mir für's erst doch etwas heftig aus..