当你构建了很多相同的对象时,一个好的设计伙伴会将标签设置为标识符,所以:
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
时,可以在此字段中设置标记:
但如果我设定它,我会收到:
除了Interface Builder中的数字外,没有办法设置标签吗?
答案 0 :(得分:2)
在IB中无法使用枚举。因为IB文件是序列化对象。当它们在运行时加载时,它们无法引用枚举的名称。
答案 1 :(得分:1)
#define
可以更容易输入,因为您不需要=
或者不必担心每个元素之间的尾随,
。但是你确实有额外的#define
更少干。我使用枚举,但无论哪种方式都很好。
typedef enum {
SongNameLabelTag = 1,
PlayButtonTag = 2
} MyViewControllerTags;
VS
#define SongNameLabelTag 1
#define PlayButtonTag 2
我以格式命名标记:<name><short type description>Tag
e.g。 SongNameLabelTag
,PlayButtonTag
此处的目标是避免为元素提供相同的标记。
我发现记住我在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)
不,这是不可能的,这是一种耻辱,因为从技术上讲它可以实现。特别是所有的语法分析器。
到目前为止,这是我手动编写某些菜单并避免界面构建器的唯一原因。