2012-10-17 22 views
7

Tôi đang phân lớp NSButtonCell để tùy chỉnh bản vẽ (chủ đề có thể tùy chỉnh). Tôi muốn tùy chỉnh cách các hộp kiểm và nút radio được vẽ.Làm thế nào để tìm hiểu xem tôi có phải là một NSButton với buttonType NSSwitchButton không?

Có ai biết cách phát hiện nút có là hộp kiểm hoặc nút radio không?

Chỉ có -setButtonType :, no getter và không -showsStateBy hoặc –ighlightsBy dường như cung cấp bất kỳ giá trị trả lại duy nhất nào cho hộp kiểm không áp dụng cho các nút ấn thông thường với hình ảnh và hình ảnh thay thế.

Cho đến nay tôi đã tìm thấy hai (không phải là rất khá) cách giải quyết, nhưng họ là những loại mà ta có thể hãy tải ứng dụng từ chối từ MAS:

  1. Sử dụng [tự valueForKey: @ "buttonType"]. Điều này làm việc, nhưng vì phương pháp này không có trong các tiêu đề, tôi đoán đây là điều mà Apple không muốn tôi làm.

  2. Ghi đè -setButtonType: và -initWithCoder: để theo dõi loại nút khi được đặt thủ công hoặc từ XIB. Sự cố ở đây là trường hợp XIB, vì các phím được sử dụng để lưu loại nút vào đĩa không có giấy tờ. Vì vậy, một lần nữa, tôi sẽ sử dụng API riêng tư.

tôi thực sự như thế này là một sự thay thế thả trong thẳng cho NSButtonCell thay vì buộc mã khách hàng sử dụng một lớp ULIThemeSwitchButtonCell riêng cho các hộp kiểm và một phần ba cho nút radio.

+1

Đối với những gì nó có giá trị, '[tự valueForKey: @ "buttonType"]' không hoạt động trên OS 10.7, nó ném một ngoại lệ khóa không xác định. – JWWalker

Trả lời

1

Nút không biết gì về phong cách của nó.

Từ các tài liệu trên NSButton

Lưu ý rằng không có phương pháp -buttonType. Phương thức thiết lập đặt các thuộc tính nút khác nhau cùng nhau thiết lập hành vi của kiểu. -

Bạn có thể sử dụng thẻ: và setTag: (được NSButton kế thừa từ NSControl) để đánh dấu nút là hộp kiểm hoặc nút radio. Nếu bạn làm điều đó theo chương trình thì bạn nên xác định hằng số bạn sử dụng. Bạn cũng có thể đặt thẻ trong Trình tạo giao diện, nhưng chỉ làm giá trị số nguyên (số ma thuật).

+0

Vì vậy, tôi đoán sau đó câu hỏi sẽ là: Sự kết hợp của các thuộc tính được thiết lập mà tôi sẽ phải tìm kiếm để xác định duy nhất tôi hiện đang là một hộp kiểm tra/radio. Đặc biệt là hộp kiểm/đồ họa nút radio sẽ hữu ích, vì đó là những gì tôi muốn thay thế bằng đồ họa theo chủ đề của mình. – uliwitness

+0

Điều này vẫn chính xác? – Matt

+0

@Matt tôi đoán vậy. Ít nhất, -setButtonType: là phương pháp tiếp xúc chính thức duy nhất cho đến nay. Nó không được làm tài sản. – uliwitness

1

Trong initWithCoder, đây là sự thích nghi của tôi về giải pháp BGHUDButtonCell.m, cập nhật cho Mac OS Sierra:

-(id)initWithCoder:(NSCoder *)aDecoder { 

    if (!(self = [super initWithCoder: aDecoder])) return nil; 

    NSImage *normalImage = [aDecoder decodeObjectForKey:@"NSNormalImage"]; 
    if ([normalImage isKindOfClass:[NSImage class]]) 
    { 
     DLog(@"buttonname %@", [normalImage name]); 
     if ([[normalImage name] isEqualToString:@"NSSwitch"]) 
     bgButtonType = kBGButtonTypeSwitch; 
     else if ([[normalImage name] isEqualToString:@"NSRadioButton"]) 
     bgButtonType = kBGButtonTypeRadio; 
    } 
    else 
    { 
     // Mac OS Sierra update (description has word "checkbox") 
     NSImage *img = [self image]; 
     if (img && [[img description] rangeOfString:@"checkbox"].length) 
     { 
     bgButtonType = kBGButtonTypeSwitch; 
     } 
    } 
} 
+0

Như bạn có thể nói bởi nó phá vỡ do Apple thay đổi ở Sierra, giải pháp này không phải là một an toàn. Nó có thể phá vỡ trong bất kỳ dấu chấm-cập nhật của Apple làm cho OS X. – uliwitness

+0

Hehe có và tôi chắc chắn rằng một người nào đó tại Apple đang xé ra. –