2009-05-23 23 views
7

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?

Trả lời

4

I could completely remove bindings from the equation and create my own errors when validation problems occur, but I feel like I would be throwing out some useful stuff that way.

Bạn có thể sử dụng NSUnderlyingErrorKey để quấn một lỗi (đối tượng cho khóa đó) trong một lỗi (người có userInfo chứa phím đó).

The only other option I can see is taking NSFormatter out of the equation, and using validateValue:forKey:error: in my Core Data managed objects to handle validation. This doesn't make as much sense to me as using a formatter, but at least I'd have full control over the NSError object.

Đây là hai cấp riêng biệt và chúng không loại trừ lẫn nhau. Xác thực trình định dạng là ở lớp xem; xác thực khóa-giá trị (trong trường hợp này, trong các đối tượng được quản lý của bạn) là ở lớp mô hình.

Nếu xác thực được đề cập sẽ xảy ra ở lớp chế độ xem, hãy phân lớp lớp NSFormatter của bạn (nếu bạn chưa có) và triển khai getObjectValue:forString:errorDescription: để trả về mô tả lỗi cụ thể hơn. (Tôi không biết liệu Bindings có thực sự sử dụng mô tả lỗi này hay không. Bạn nên kiểm tra.)

Nếu xác thực sẽ xảy ra ở lớp mô hình, hãy thực hiện validate<Key>:error: (phiên bản validateValue:forKey:error:) trong lớp con NSManagedObject của bạn.

Nếu một số ràng buộc ở lớp mô hình và một số khác ở lớp xem, hãy thực hiện cả hai. Bạn được tự do triển khai một số kiểm tra trong trình định dạng và các kiểm tra khác trong mô hình, nếu điều đó có ý nghĩa đối với ứng dụng và séc của bạn.

+1

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ố. –

Các vấn đề liên quan