如何保存对以编程方式添加的控件的引用?

时间:2012-12-31 04:45:37

标签: iphone objective-c ios

我以编程方式在我的视图中添加了3个按钮,然后我将按钮添加到数组中,以便我以后可以访问它们:

for (i = 0; i < 3; i++)
{
  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  [view addSubview:button];
  [_buttons addObject:button];
}

如果我引用数组中的按钮并更改按钮的图像,则不会更改屏幕上的按钮。

UIButton* button = [_buttons objectAtIndex: 0];
[button setImage:thumb forState:UIControlStateNormal];

我找到了一种通过循环查看视图中所有子视图来更改按钮图像的方法,但是有更好的方法吗?

for (UIView* subView in ((UIView*)[self.view.subviews objectAtIndex:0]).subviews){
    if ([subView isKindOfClass:[UIButton class]]){
        UIButton *button = (UIButton*)subView;
        if (button.tag == self.selected){
            [button setImage:thumb forState:UIControlStateNormal];
        }
    }
}

5 个答案:

答案 0 :(得分:4)

此常见原因是您的阵列尚未初始化。当发生这种情况时,Objective C不会抱怨或抛出异常:相反,它的行为就好像添加元素的调用从未发生过一样。当你尝试取回物品时它也会返回nil。

将此行添加到viewDidLoad方法:

_buttons = [NSMutableArray array];

这应该可以解决问题。

答案 1 :(得分:0)

这可能有助于点击事件:

      -(void)clickEvent:(id)sender
      {
           [sender setImage:thumb forState:UIControlStateNormal];
      }

如果这是您举办活动的方式。

答案 2 :(得分:0)

当您执行addSubview时,查看要添加的子视图。 addObject也保留它。因此两者都是不同的结果。更改数组中对象的属性不会影响视图保留的对象。 您可以使用标记来避免循环。在视图上添加按钮时,会为它们设置唯一标记。当你想要访问它们时,直接使用标记来获取它。

//set tags for buttons
      UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
      [button setTag:999];
      [view addSubview:button];

//access using tag
      UIButton *button = (UIButton*)[view viewWithTag:999];
      [button setImage:thumb forState:UIControlStateNormal];

答案 3 :(得分:0)

创建标签后,在按钮上添加标签。然后使用该标签来获取该按钮。

for (i = 0; i < 3; i++)
{
  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  button.tag = i+1;
  [view addSubview:button];
  [_buttons addObject:button];
}

然后您可以像访问它一样访问它:

UIButton *button1 = (UIButton *)[self.view viewWithTag:1];
UIButton *button2 = (UIButton *)[self.view viewWithTag:2];
UIButton *button3 = (UIButton *)[self.view viewWithTag:3];

答案 4 :(得分:0)

添加UIControl programatically以便reference稍后使用add tag different时应该 yourBtn.tag = 111;

reference

现在获取UIButton UIButton *button = (UIButton*)[yourViewWhereYouAdded viewWithTag:111]; ,如下所示:

{{1}}