0

我正在构建一种带有许多 uibuttons 的检查表,我正在使用代码(而不是 IB)添加它。I would like to have it that when certain buttons are selected, other buttons cannot be selected. 例如,我有一排按钮,分别是 LOW、MEDIUM、HIGH。我不希望用户可以选择 2 个选项(如果他们想更改他们的选择,那很好,一次只能选择 2 个)。

我知道我的方法的一般结构,这是我到目前为止所拥有的:

-(void)addButtons这是我将用按钮填充视图的地方(这里只显示一个按钮,但有很多):

-(void)addButtons{

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"" forState:UIControlStateNormal];
    button.frame = CGRectMake(209, 54, 127, 18);
    button.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [imageView addSubview:button];

}

-(void)clicked:(UIButton *)sender 这是单击按钮时将调用的方法。我希望它作为参数提交。然后该按钮将更改其外观以表示它已被单击。我让它透明的原因是因为我在图像顶部有按钮,您需要查看它们下面的内容。我也不认为sender.backgroundColor = [UIColor redColor];会像我想要的那样工作,但这不是重点。

-(void)clicked:(UIButton *)sender{

    sender.alpha = 0.5;
    sender.backgroundColor = [UIColor redColor];

    [self setRelatedButtons:sender];

}

-(void)setRelatedButtons' 这是我将确保每个“集合”只选择一个按钮的方法

-(void)setRelatedButtons:(UIButton *)sender{

    //since I know this button is clicked
    //set related buttons to unclicked

}

总结一切,这就是我想知道的:

1)如何设置按钮的外观以保持选中状态?

2)我应该将什么传递给我的clickedsetRelatedButtons方法来识别当前按钮?现在我有按钮本身,但有更好的东西吗?

3) 关联某些按钮的最佳方式是什么?我可以为每组按钮使用一个数组,但我希望有更好的方法。我可以使用一个typedef吗?(以前从未使用过其中之一)

4

1 回答 1

1

要将按钮的外观设置为保持选中状态,您可以做很多不同的事情。您可以更改标签、背景颜色、文本颜色等。可能对此有所帮助。只是让您知道,如果您想将其提交到应用商店,您不能使用实际选择状态来显示按钮已被选中(所以不要这样做button.selected = YES)。苹果明确禁止这样做。

如果您想取消选择所有其他按钮,只需在单击一个按钮时将所有按钮的外观设置为未选中。完成此操作后,将发送消息的按钮设置为选中(使用您从上面决定的任何内容)。将您的按钮放在一个数组中,这样您就可以创建一个 for 循环来访问所有按钮(NSMutableArray将有助于addObject)。

要回答您的第二个问题,传递UIButton *本身很好(您实际上只是传递一个指针)。这样做的好处是能够做一些事情,[button doSomething]而不必在数组或其他数据类型中找到它。

我不太确定您的第三个问题在问什么,但是UIButton如果您愿意,您可以进行子类化。每组按钮的数组实际上听起来是个好主意。你甚至可以做一个数组数组。或者,您可以创建一个自定义持有者类,其中包含数组,并使用返回所需内容的方法。

如果您使用数组,您可以将一个整数传递给您的addButton方法,告诉该方法将按钮放入哪个数组(或复杂数组的一部分)。

另外,尽量让你的问题集中在一件事上;如果人们必须回答多个问题,他们就不太可能回答您的问题。您可以根据需要提出任意数量的问题,只需分别提出即可。

于 2012-07-13T16:09:59.870 回答