Jedną rzeczą, z którą zawsze miałem problemy w wiązaniu kakao, była prezentacja błędu, na przykład gdy użytkownik wpisze błędną wartość do pola tekstowego z dołączonym formatatorem. Normalnie przesłoniłbym willPresentError:
gdzieś w łańcuchu respondenta, ale moim problemem jest to, że obiekty NSError utworzone przez system Bindings nie zawierają wystarczającej ilości informacji, aby mi powiedzieć, co się nie udało, lub jeśli jest to nawet błąd, który mnie interesuje w dostosowywaniu. Mógłbym całkowicie usunąć wiązania z równania i stworzyć własne błędy, gdy pojawią się problemy z walidacją, ale czuję, że w ten sposób wyrzucę jakieś użyteczne rzeczy.Jak przesłonić prezentację NSError w przypadku powiązań?
Udało mi się ominąć to poprzez wdrożenie metod delegatów NSControl i przechowywanie kontroli, która nie powiodła się w zmiennej instancji w moim kontrolerem widoku. Jeśli liczba ta nie zostanie zmniejszona do zera, gdy pojawi się willPresentError:
, wiem, co nie udało się sprawdzić.
- (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];
}
To działa, gdy pierwsze zmiany responder, ale nie wtedy, gdy zadzwonię commitEditing
na kontrolerze widoku, więc jest to tylko częściowo przydatne do mnie.
Jedyną inną opcją którą widzę jest wyjęcie NSFormatter z równania i użycie validateValue:forKey:error:
w moich obiektach zarządzanych Core Data do obsługi sprawdzania poprawności. Nie ma to dla mnie większego sensu niż używanie formatera, ale przynajmniej miałbym pełną kontrolę nad obiektem NSError.
Czuję, że muszę czegoś przegapić, aby uzyskać taki rodzaj rozłączenia z obsługą błędów. Jakieś sugestie?
Podklasy NSFormatter i podczas gdy wiązania używają komunikatu o błędzie NSString zapewniam, że ostateczny NSAlert jest nadal całkiem nagimi kośćmi (Chciałbym dodać sugestię przywracania do błędu, przynajmniej). Walidacja, którą robię, wydaje się być lepiej dopasowana do moich podklas NSFormatter, dlatego jestem niezdecydowany, aby zastosować walidację klucz-wartość w moim modelu. W efekcie wykonałbym wszystkie rodzaje analizowania ciągów, które nie mają nic wspólnego z modelem danych, po to tylko, aby móc spersonalizować komunikat błędu, gdy coś pójdzie nie tak. –