如何在 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。它展示了如何使用UIButton
的CALayer
属性和使用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