如何找出我是一个带按钮类型NSSwitchButton的NSButton?

时间:2012-10-17 13:57:34

标签: objective-c cocoa user-interface appkit nsbutton

我正在对NSButtonCell进行子类化以自定义绘图(可自定义的主题)。我想自定义复选框和单选按钮的绘制方式。

有谁知道如何检测按钮是复选框还是单选按钮?

只有-setButtonType:,没有getter,-showsStateBy和-highlightsBy似乎都没有为复选框提供任何唯一的返回值,这些复选框也不适用于带有图像和替代图像的常规按钮。

到目前为止,我已经找到了两个(不是很漂亮)的解决方法,但它们可能会让应用程序被MAS拒绝:

  1. 使用[self valueForKey:@“buttonType”]。这是有效的,但由于方法不在标题中,我认为这是Apple不希望我这样做的。

  2. 覆盖-setButtonType:和-initWithCoder:在手动设置或从XIB设置时跟踪按钮类型。这里的问题是XIB情况,因为用于将按钮类型保存到磁盘的密钥没有记录。所以,我将再次使用私有API。

  3. 我真的希望这是NSButtonCell的直接替代品,而不是强制客户端代码使用单独的ULIThemeSwitchButtonCell类作为复选框,第三个用于单选按钮。

3 个答案:

答案 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"}