【问题标题】:How to use a custom UIButton category with Interface Builder?如何在 Interface Builder 中使用自定义 UIButton 类别?
【发布时间】: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 作为你的“按钮” .

标签: ios objective-c uibutton interface-builder


【解决方案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 是只读的。看来得自己画了。检查我的编辑。
猜你喜欢
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2018-08-22
相关资源
最近更新 更多