Eine Sache, mit der ich in Cocoa Bindings schon immer Probleme hatte, war die Fehlerdarstellung, zum Beispiel wenn der Benutzer den falschen Wert in ein Textfeld mit angehängtem Formatierer eintippt. Normalerweise würde ich willPresentError:
irgendwo in der Responder-Kette außer Kraft setzen, aber mein Problem ist die NSError Objekte durch die Bindungen System erstellt nicht genügend Informationen enthalten, für mich zu sagen, was fehlgeschlagen ist, oder ob es auch ein Fehler, den ich im Customizing interessiert bin. Ich könnte Bindungen vollständig aus der Gleichung entfernen und meine eigenen Fehler erzeugen, wenn Validierungsprobleme auftreten, aber ich habe das Gefühl, dass ich auf diese Weise einige nützliche Dinge rausschmeißen würde.Wie kann ich die NSError-Präsentation überschreiben, wenn Bindungen involviert sind?
Ich habe in der Lage, dies zu umgehen, indem sie die NSControl Delegatmethoden Implementierung und Speicherung die Steuerung, die in einer Instanzvariablen in meiner Sicht Controller ausgefallen. Wenn es bis zum Zeitpunkt willPresentError:
nicht nil ist, weiß ich, was nicht validiert wurde.
- (BOOL)control:(NSControl *)control didFailToFormatString:(NSString *)string errorDescription:(NSString *)error;
{
_errorSender = [control retain];
return NO;
}
- (NSError *)willPresentError:(NSError *)error;
{
if (_errorSender != nil)
{
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:[error userInfo]];
NSString *help = NSLocalizedString(@"Why are you always messing up? You are a terrible person.", @"");
[_errorSender release];
_errorSender = nil;
[userInfo setObject:help forKey:NSLocalizedRecoverySuggestionErrorKey];
return [NSError errorWithDomain:[error domain] code:[error code] userInfo:userInfo];
}
return [super willPresentError:error];
}
Dies funktioniert, wenn die Ersthelfer Veränderungen, aber nicht, wenn ich commitEditing
auf den View-Controller nennen, so ist es mir nur teilweise nützlich.
Die einzige andere Option, die ich sehen kann, ist NSFormatter aus der Gleichung zu nehmen und validateValue:forKey:error:
in meine Core Data verwalteten Objekte zu verwenden, um die Validierung zu behandeln. Dies ist für mich nicht so sinnvoll wie die Verwendung eines Formatierungsprogramms, aber zumindest hätte ich die volle Kontrolle über das NSError-Objekt.
Ich fühle mich wie ich es etwas zu sein, diese Art von disconnect mit Fehlerbehandlung fehlen werden müssen. Irgendwelche Vorschläge?
Ich bin NSFormatter Unterklasse, und während Bindungen verwendet die NSString-Fehlermeldung, die ich die endgültige NSAlert ist immer noch ziemlich nackt Knochen (Ich würde gerne einen Wiederherstellungsvorschlag zu dem Fehler hinzufügen, mindestens). Die Validierung, die ich gerade mache, scheint für meine NSFormatter-Unterklassen besser geeignet zu sein. Aus diesem Grund zögere ich, die Schlüsselwertvalidierung für mein Modell zu implementieren. Ich würde am Ende alle Arten von String-Parsing durchführen, die nichts mit dem Datenmodell zu tun haben, nur um die Front-End-Fehlermeldung anpassen zu können, wenn etwas schief geht. –