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

Posted

技术标签:

【中文标题】如何在 Interface Builder 中使用自定义 UIButton 类别?【英文标题】:How to use a custom UIButton category with Interface Builder? 【发布时间】:2013-06-05 15:51:46 【问题描述】:

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

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

.m 文件中:

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

这就是我所需要的。我如何在 IB 中使用它?我想成为 CardGameButtons 的屏幕上有一堆 UIButtons。但是当我尝试将视图控制器中对 UIButton 的调用切换到 CardGameButton 时,它告诉我 CardGameButton 不是一种类型(是的,我导入了文件)。当我尝试将情节提要中的 UIButton 类切换为 CardGameButtons 时,控制台告诉我它们是“未知类”。我尝试对 UIButton 进行子类化,但这不起作用(我只需要它们是具有额外属性的 RoundedRectButtons,并且由于您不能将 RoundedRectButton 子类化,因此它们将无法正确显示)。如何在 IB 中完成这项工作?

【问题讨论】:

由于类别不能有属性,我建议你只使用一个自定义按钮,并做任何你想要的绘图,或者使用一个带有轻击手势识别器的 UIImageView 作为你的“按钮” . 【参考方案1】:

您将 CardGameButtons 视为 UIButton 的子类,而实际上它是一个类别。您声明为 UIButton 的任何内容都将具有标准的 discovered 属性,但您不能“创建”CardGameButtons,因为它本身不是一个东西。

【讨论】:

但是类别不能添加任何存储,所以你不能添加任何属性(至少是有后备 ivar 的)。【参考方案2】:

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

我建议你尝试继承 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。它展示了如何使用UIButtonCALayer 属性和使用UIBezeirPath

【讨论】:

buttonType 是一个只读属性。我在这里做错了吗? -(id)initWithCoder:(NSCoder *)aDecoder if (self = [super initWithCoder:aDecoder]) self.buttonType = UIButtonTypeRoundedRect; 其实你是对的。 buttonType 是只读的。看来得自己画了。检查我的编辑。

以上是关于如何在 Interface Builder 中使用自定义 UIButton 类别?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Interface Builder 中的自定义 UITableViewCell?

如何使用 Interface Builder 在其他 UI 元素的背景中添加 UIButton?

如何在 Interface Builder 中创建 NSTableRowView 原型

如何在XIB(Interface Builder)中使用UIPageViewController的子类来设置DataSource、Delegate和TransitionStyle

如何使用 Interface Builder 和 Swift 在 xCode6 中正确创建故事板

如何在 Interface Builder 中获取 iPhone,而不是 iPad 视图