将enum或#define标记设置为接口构建器中的对象

时间:2011-12-07 12:42:48

标签: objective-c xcode interface-builder

当你构建了很多相同的对象时,一个好的设计伙伴会将标签设置为标识符,所以:

UITextField *object1, *object2;
//Initialize it
[object1 setDelegate:self];
[object2 setDelegate:self];
[object1 setTag: 1]; 
[object2 setTag: 2];

为了更容易和“美丽”理解代码,你可以创建一个枚举。

typedef enum {
      MyTextField1 = 1,
      MyTextField2
} allTextField;

所以,你不会只放一个数字,可以用这种方式设置标签:

[object1 setTag: MyTextField1];
[object2 setTag: MyTextField2];

在任何委托功能中,您可以更轻松地对待它

- (BOOL)textFieldShouldClear:(UITextField *)textField {
   switch(textField.tag) {
       case MyTextField1: return YES;
       case MyTextField2: return NO;
   }
}

但是,当您在XCode中构建Interface Builder时,可以在此字段中设置标记:

enter image description here

但如果我设定它,我会收到:

enter image description here

除了Interface Builder中的数字外,没有办法设置标签吗?

3 个答案:

答案 0 :(得分:2)

在IB中无法使用枚举。因为IB文件是序列化对象。当它们在运行时加载时,它们无法引用枚举的名称。

答案 1 :(得分:1)

定义vs Enum

#define可以更容易输入,因为您不需要=或者不必担心每个元素之间的尾随,。但是你确实有额外的#define更少干。我使用枚举,但无论哪种方式都很好。

typedef enum {
      SongNameLabelTag = 1,
      PlayButtonTag = 2
} MyViewControllerTags;

VS

#define SongNameLabelTag 1
#define PlayButtonTag 2

命名惯例

我以格式命名标记:<name><short type description>Tag

e.g。 SongNameLabelTagPlayButtonTag

IB中的标记值

此处的目标是避免为元素提供相同的标记。

我发现记住我在IB工作时使用的最后一个标签感到很沮丧。

保持您的定义是最新的似乎是一个解决方案,但这很烦人,有时候它不起作用。

E.g。将元素移动到另一个视图控制器。 (我通常会将元素组提取到单独的视图控制器中。这将导致您的编号从奇怪的数字开始或与现有元素冲突。)

当快速进行原型设计和快速工作时,我会将每个元素标记添加为#define。我喜欢尽快工作:)


我的解决方案是使用随机数。您可以使用的最大值是NSIntegerMax (32-bit),即2147483647.

最重要的是,他们需要快速上市!

每次需要一些随机标签时,只需将此链接添加为书签:

http://www.random.org/integers/?num=100&min=1&max=999999999&col=1&base=10&format=html&rnd=new

答案 2 :(得分:0)

不,这是不可能的,这是一种耻辱,因为从技术上讲它可以实现。特别是所有的语法分析器。

到目前为止,这是我手动编写某些菜单并避免界面构建器的唯一原因。