如何在Interface Builder中使用自定义UIButton类别?

时间:2013-06-05 15:51:46

标签: ios objective-c uibutton interface-builder

我正在为我的妹妹一时兴起一个简单的纸牌游戏。我正在使用UIButtons:默认状态是面朝下,选择状态正面朝上。我需要按钮有一个布尔属性,告诉我它们是否曾被翻过来。如果没有,它被设置为true(这样我不只是在每次翻转时绘制随机卡)。我尝试创建一个名为CardGameButton的UIButton类。在.h文件中:

@interface UIButton (CardGameButton)
@property (nonatomic) BOOL discovered;
@end

在.m文件中:

@implementation UIButton (CardGameButton)
@dynamic discovered;
@end

这就是我真正需要的。我如何在IB中使用它?我在屏幕上有一堆UIButtons,我想成为CardGameButtons。但是当我尝试将我的视图控制器中的UIButton调用切换到CardGameButton时,它告诉我CardGameButton不是一个类型(是的,我导入了文件)。当我尝试将故事板中的UIButtons类转换为CardGameButtons时,控制台告诉我它们是“未知类”。我尝试了子类化UIButton,但是这不起作用(我只需要它们是带有额外属性的RoundedRectButtons,因为你不能将RoundedRectButton子类化,它们将无法正确显示)。我如何在IB中完成这项工作?

2 个答案:

答案 0 :(得分:1)

您正在将CardGameButtons视为UIButton的子类,而不是它是一个类别。您声明为UIButton的任何内容都会将discovered属性作为标准,但您无法“创建”CardGameButtons,因为它本身并不是一件事。

答案 1 :(得分:0)

类别不是类型。它们只是用于向类中添加一些扩展行为。

我建议您尝试继承UIButton并将其命名为CardGameButton。将BOOL属性添加到其接口。您仍然可以将其设为圆形矩形按钮,方法是将buttonType设置为UIButtonTypeRoundedRect “圆形矩形按钮不是单独的子类。”。然后覆盖

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    if(event.type == UIEventTypeTouches){
        self.discovered = YES; // or handle the logic as you want here
    }
    [super sendAction:action to:target forEvent:event];
}

您可以从IB中将UIButton添加到视图中,然后将其类添加到创建的子类中,并将其类型设置为圆形矩形。


修改:正如您所说,buttonType实际上是readOnly,因此我们无法使用它来绘制圆形矩形按钮。但事实证明,绘制起来并不难。

检查this tutorial。它显示了如何使用CALayer的{​​{1}}属性并使用UIButton来执行此操作。