我正在对NSButtonCell进行子类化以自定义绘图(可自定义的主题)。我想自定义复选框和单选按钮的绘制方式。
有谁知道如何检测按钮是复选框还是单选按钮?
只有-setButtonType:,没有getter,-showsStateBy和-highlightsBy似乎都没有为复选框提供任何唯一的返回值,这些复选框也不适用于带有图像和替代图像的常规按钮。
到目前为止,我已经找到了两个(不是很漂亮)的解决方法,但它们可能会让应用程序被MAS拒绝:
使用[self valueForKey:@“buttonType”]。这是有效的,但由于方法不在标题中,我认为这是Apple不希望我这样做的。
覆盖-setButtonType:和-initWithCoder:在手动设置或从XIB设置时跟踪按钮类型。这里的问题是XIB情况,因为用于将按钮类型保存到磁盘的密钥没有记录。所以,我将再次使用私有API。
我真的希望这是NSButtonCell的直接替代品,而不是强制客户端代码使用单独的ULIThemeSwitchButtonCell类作为复选框,第三个用于单选按钮。
答案 0 :(得分:2)
按钮对其风格一无所知。
来自NSButton的文档
请注意,没有-buttonType方法。 set方法设置各种按钮属性,共同确定类型的行为。 -
您可以使用tag:和setTag :(由NSControl从NSConut继承),以便将按钮标记为复选框或单选按钮。如果以编程方式执行此操作,则应定义所使用的常量。您也可以在Interface Builder中设置标记,但只能作为整数值(幻数)。
答案 1 :(得分:0)
在initWithCoder中,这是我改编的适用于Mac OS Sierra的BGHUDButtonCell.m解决方案:
-(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;
}
}
}
答案 2 :(得分:0)
这对我来说很奇怪,NSButton缺少它。我不明白也就是说,扩展NSButton来存储最后的设置值很容易:
{
"url": "https://MYDOMAIN",
"secret": "DEFAULT SECRET",
"database": "mongo",
"mongo": {
"host": "127.0.0.1",
"port": "27017",
"username": "nodebb",
"password": "MYPASSWORD",
"database": "nodebb",
"uri": ""
},
"port": "4568"}