2011-08-16 31 views
7

Tôi có một NSTokenField cho phép người dùng chọn liên hệ (Giống như trong Mail.app). Vì vậy, NSTextField được liên kết với một mảng trong biến cá thể model.recipient của tôi.NSTokenField không kiểm tra mã thông báo trên blur

Giờ đây, người dùng có thể chọn mục nhập từ danh sách hoàn thành tự động, ví dụ: Joe Bloggs: [email protected] và ngay sau khi anh truy cập Nhập mã thông báo (Joe Bloggs) được hiển thị và model.recipients hiện chứa mục nhập BBContact.

Bây giờ nếu người dùng bắt đầu gõ một số phím (vì vậy những gợi ý được hiển thị) và sau đó chạm Tab thay vì Nhập mã thông báo với các giá trị của văn bản hoàn (Joe Bloggs: [email protected]) được tạo ra và NSTokenFieldDelegate phương pháp này không được gọi, để tôi có thể trả lời sự kiện này. Mục nhập model.recipient hiện chứa NSString thay vì mục nhập BBContact.

Nghiêm túc phương thức ủy nhiệm tokenField:shouldAddObjects:atIndex: không được gọi, đó là những gì tôi mong đợi khi người dùng tab ra khỏi trường mã thông báo.

enter image description here

Trả lời

6

Nhấn phím gọi làValidObject trên đại biểu để trả về NO cho NSTokenField trong đó, tuy nhiên bạn muốn trả về YES nếu không có ký tự chữ và số trong đó nếu không người dùng sẽ không thể lấy nét ra khỏi trường (chuỗi chứa nhân vật vô hình unicode dựa trên bao nhiêu thẻ tồn tại)

việc thực hiện ít mong manh tôi có thể đưa ra là:

- (BOOL)control:(NSControl *)control isValidObject:(id)token 
{ 
    if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]]) 
    { 
     if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound) return YES; 
     return NO; 
    } 
    return YES; 
} 
-1

này có thể là do "enter" có thể gửi sự kiện của trường thẻ để nó hành động nơi "tab" chìa khóa chỉ cần thêm văn bản với nó. Bạn có thể thử đặt thuộc tính -isContinuous thành YES và xem bạn có nhận được kết quả mong muốn hay không.

+0

đó nghe có vẻ đầy hứa hẹn vì vậy tôi nhanh chóng thử nó ra, nhưng vấn đề này vẫn tồn tại vì vậy tôi vẫn có hành vi tương tự. – Besi

+0

Tôi đã làm cho nó hoạt động ngay bây giờ bằng cách sử dụng gọi lại 'isValidObject' – Besi

0

tôi đã có thể giải quyết vấn đề sử dụng gợi ý @ valexa của. Trong trường hợp mờ với TAB tôi phải đi qua tất cả các mục và tra cứu các đối tượng liên lạc của tôi cho bất kỳ chuỗi nào.

- (BOOL)control:(NSControl *)control isValidObject:(id)token{ 
    if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]]) 
    { 
     NSTokenField *tf = (NSTokenField *)control; 

     if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound){ 
      return YES; 
     } else { 

      // We get here if the user Tabs away with an entry "pre-selected" 
      NSMutableArray *set = @[].mutableCopy; 
      for(NSObject *entry in tf.objectValue){ 

       GSContact *c; 
       if([entry isKindOfClass:GSContact.class]){ 
        c = (GSContact *)entry; 
       } 

       if([entry isKindOfClass:NSString.class]){ 

        NSString *number = [[(NSString *)entry stringByReplacingOccurrencesOfString:@">" withString:@""] 
             componentsSeparatedByString:@"<"][1]; 
        c = [self findContactByNumber:number]; 
       } 

       if(c) [set addObject:c]; 
      } 

      [control setObjectValue:set]; 
     } 
    } 
    return YES; 
} 

enter image description here

+0

Và bạn trao giải thực hiện cụ thể giải pháp của tôi các điểm để trả lời câu hỏi này? Tôi nghĩ rằng có thể là chống lại các quy tắc của stackoverflow. – valexa

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