是否可以在UI按钮中添加第二个标签?

时间:2011-05-01 13:33:58

标签: iphone objective-c cocoa-touch ios uibutton

我想知道是否可以在UIButton中添加第二个标签?我在for循环中以编程方式创建了许多按钮,并且需要引用按钮的编号(例如0,1,2)和另一个参考(整数),其中我存储对按钮链接的页面的引用至(例如22,30,49)。这些数字不相关,所以我无法确定第一个到第二个。

这就是我想要的:

for (int k=0; k < numberOfTabs; k++) // k < 4 (e.g. 3 < 4) 
{
    UIButton* btn = [[[UIButton alloc] initWithFrame:frame] autorelease];
    btn.tag = k;

btn.tag2 = someReference;

    btn.frame = CGRectMake(-10, 0, buttonWidth, buttonHeight);
    [btn    addTarget:self
            action:@selector(tabAction:)
  forControlEvents:UIControlEventTouchUpInside];
    [btn    addTarget:self
                action:@selector(tabDelete:)
      forControlEvents:UIControlEventTouchDragOutside];
/...

非常感谢任何建议。

5 个答案:

答案 0 :(得分:5)

不,你不能。至少不是直接的。你可以继承UIButton并添加另一个int属性,但这似乎对你想要的东西有点过分了。

我认为最好只决定如何将这两个值放在单个标记整数中...

e.g。如果您有pageNumberbuttonNumber,则可以创建按钮标记,如:

button.tag = pageNumber*100 + buttonNumber;

当您想要一个按钮所属的页面或页面上按钮的索引时,您可以对该标记进行编码:

int pageNum = button.tag /100;
int buttonNum = button.tag % 100;

答案 1 :(得分:3)

  • 创建UIButton的子类,并将第二个标记声明为属性。

  • 您还可以创建一个数组来将按钮的标记映射到页面,这会阻止创建子类,但会引入一些数组管理方法。

我更喜欢阵列解决方案,因为我试图阻止子类化。

答案 2 :(得分:2)

为什么不将第二个(如果需要的话)参数存储在像NSMutableArray这样的东西中?

NSMutableArray *button_to_page = [[NSMutableArray alloc] init];

...

for(...)
{

// Your button creation code

[button_to_page addObject:[NSNumber numberWithInt:my_button.tag];

}

您只需索引到button_to_page数组即可随时获取您的页码。 您还可以在数组中搜索页码并获取按钮索引(如果需要)。

现在,已经说过了,你在这里为每个按钮的页面标签创建一个新的NSNumber对象,并且还带有一个NSMutableArray来启动。我真的认为继承UIButton是可行的方法。我不喜欢将内容编码到单个标签中的想法,除非有一个真正令人信服的理由。如果你是子类,你仍然保持UIButton非常轻量级,并且所有数据都非常干净地封装在同一个对象中:

<强> MultiTag_UIButton.h

#import <Foundation/Foundation.h>

@interface MultiTag_UIButton : UIButton {

}
@property (nonatomic, assign) int page;

@end

<强> MultiTag_UIButton.m

#import "MultiTag_UIButton.h"

@implementation MultiTag_UIButton

@synthesize page;

@end

它真的很简单,你不必编写任何代码,只需添加页面属性即可进入比赛。然后你可以这样做:

MultiTag_UIButton *test_button = [[MultiTag_UIButton alloc] init];

test_button.tag = 1;
test_button.page = 23;

NSLog(@"tag %i  page %i", test_button.tag, test_button.page);

[test_button release];

干净简单。实际上,你必须在新课程中多做一点,但你明白了。

答案 3 :(得分:1)

根据我所看到的,我看到Apple的documentation为UIView定义了tag属性(因为UIButton继承自UIView),看起来你只能拥有它。

如上所述,如果有必要,没有什么可以阻止你继承UIButton以添加另一个标记属性。

答案 4 :(得分:1)

你可以继承,但是当你处理它时(如果你将它与非子类按钮混合),你将不得不询问对象是否是新的对象类型或实现新的访问器来获取它,这有点不变形。

如果您只是按原样离开该类,但是对标记的现有位进行分区,以便低16位用于一个目的而高位用于其他用途?什么都没有改变界面,你只需要在.tag上做一些掩饰来获得你的价值观。