Một điều tôi luôn gặp rắc rối với Cocoa Bindings là trình bày lỗi, ví dụ khi người dùng nhập sai giá trị vào trường văn bản với trình định dạng đính kèm. Bình thường, tôi sẽ ghi đè lên willPresentError:
ở đâu đó trong chuỗi trả lời, nhưng vấn đề của tôi là các đối tượng NSError được tạo bởi hệ thống Bindings không chứa đủ thông tin để tôi biết những gì không thành công, hoặc nếu đó là lỗi tôi quan tâm. Tôi hoàn toàn có thể loại bỏ các ràng buộc khỏi phương trình và tạo ra các lỗi của riêng tôi khi các vấn đề xác nhận xảy ra, nhưng tôi cảm thấy như tôi sẽ ném ra một số thứ hữu ích theo cách đó.Tôi làm cách nào để ghi đè bản trình bày NSError khi có liên quan?
Tôi đã có thể thực hiện việc này bằng cách thực hiện các phương thức ủy nhiệm NSControl và lưu trữ điều khiển không thành công trong một biến mẫu trong trình điều khiển khung nhìn của tôi. Nếu nó không phải là không theo thời gian willPresentError:
cuộn xung quanh, tôi biết những gì không thể xác thực.
- (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];
}
này hoạt động khi thay đổi trả lời đầu tiên, nhưng không phải khi tôi gọi commitEditing
trên bộ điều khiển xem, do đó, nó chỉ là một phần hữu ích với tôi.
Tùy chọn duy nhất khác mà tôi có thể thấy là lấy NSFormatter ra khỏi phương trình và sử dụng validateValue:forKey:error:
trong các đối tượng được quản lý dữ liệu lõi của tôi để xử lý xác thực. Điều này không có ý nghĩa nhiều với tôi khi sử dụng trình định dạng, nhưng ít nhất tôi cũng có toàn quyền kiểm soát đối tượng NSError.
Tôi cảm thấy mình phải thiếu một thứ gì đó để có loại ngắt kết nối này với xử lý lỗi. Bất kỳ đề xuất?
Tôi đang phân lớp NSFormatter, và trong khi các ràng buộc không sử dụng thông báo lỗi NSString tôi cung cấp NSAlert cuối cùng vẫn là các xương khá trần (tôi muốn thêm gợi ý khôi phục vào lỗi, ở mức tối thiểu). Việc xác thực tôi đang làm có vẻ như nó phù hợp hơn cho các lớp con NSFormatter của tôi, đó là lý do tại sao tôi do dự để thực hiện xác thực giá trị khóa trên mô hình của tôi. Tôi sẽ làm tất cả các loại phân tích chuỗi không liên quan gì đến mô hình dữ liệu, chỉ để có thể tùy chỉnh thông báo lỗi front-end khi có sự cố. –