如何使用枚举类型的属性正确扩展类

时间:2014-07-18 02:21:56

标签: objective-c enums scope typedef

我对Objective C和iOS开发非常陌生,但我确实对其他几种语言有一点经验。

我目前正在为自己开发一个实验性学习应用程序,我想为UIButton添加一个属性。我想要添加的属性是我试图定义的枚举类型,但是我很难理解范围,知道在哪里定义枚举以及是否有必要使用typedef(不太熟悉)至少还有typedef)。

所以,我的问题是我在哪里以及如何定义一个枚举,以便能够使用枚举作为属性值来扩展现有框架的一部分。这是一个满嘴......嘿。

谢谢, 添

2 个答案:

答案 0 :(得分:0)

编辑以反映所提出的真实问题

道歉。你的帖子似乎反映了对Objective-C的更天真的理解,而不是你真正拥有的。

坏消息是,在框架中向类扩展添加属性不是您可以做的事情。 Apple声明:

类扩展与类别有一些相似之处,但它只能添加到编译时拥有源代码的类...

< / p>

如果子类无法满足您的需要,您可以将类别与关联对象一起使用。一个很好的例子是here

答案 1 :(得分:0)

Apple提供了一个宏。这最显着地增加了自动完成。

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault = 0,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
};

表示不同的值。

如果你想要选择多个选项的位掩码,可以使用NS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

用作位掩码

UIViewAutoresizing resizing = (UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin)

如果您希望能够从课外设置它,请将其添加到头文件

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSUInteger, InsetCellAlignment){
    InsetCellAlignmentLeft,
    InsetCellAlignmentRight
};

@interface InsetCell : UITableViewCell
@property InsetCellAlignment alignment;
@property(nonatomic)CGFloat inset;
@end

如果你需要在一些状态下扩展UIButton,这是一个强有力的指示,你没有正确使用MVC。控制器应该知道状态并分别配置按钮。


那就是说你可以使用&#34; Associative References&#34;来获得你想要的结果。可用于模拟添加的成员变量。 IMO他们很臭,我从来没用过它们。

A category used along with associative references