UIButton操作在一段时间后不起作用(可能在一些垃圾收集之后)

时间:2012-08-01 13:21:34

标签: ios objective-c uibutton action programmatically-created

我有一个带有大约60个按钮的UIView,它们调用相同的方法。单击按钮时,我通过此方法打开不同的图像 - 我使用按钮标签来了解调用了哪个按钮以及要显示的图像。把它想象成一个画廊。

由于按钮的绘图很困难,我使用了Interface Builder并使用该UIView创建了一个XIB。我只需将按钮拖到正确的位置,然后将它们连接到事件TouchUpInside上的方法。我用它来将视图添加到我的主视图中:

NSArray *xibContents = [[NSBundle mainBundle] loadNibNamed:@"Tour" owner:self options:nil];
UIView *tour = [xibContents lastObject];
[self.view addSubview:tour];

到目前为止一切顺利,乍看之下效果很好。不幸的是,当应用程序使用一段时间后会出现一些问题。按钮仍然突出显示(所以它们仍然在这里!)但是没有任何动作被调用。只有亮点,但没有行动。

我不知道为什么,但不知何故垃圾收集器似乎破坏了UIButton目标。为什么?我该如何解决这个问题?

请注意我没有以编程方式声明按钮。我认为将它们放入IB就足够了。

此外,我无法在内存警告和UIButton目标的破坏之间找到连接。内存警告确实出现在我的应用程序中,但大部分时间按钮仍然有效。

但它必须是一个垃圾收集器,因为这个bug完全是随机出现的。无法重现此错误,有时会在5次点击后发生,有时在我的应用中花费10分钟后会发生。

3 个答案:

答案 0 :(得分:1)

您可以尝试像这样加载你的笔尖:

首先,在标题中创建一个IBOutlet属性。然后,当您创建Nib时,将UIView IBOutlet连接到Nib中的顶级视图(一切都在其中)。然后在您的实现中,像这样加载它:

 [[NSBundle mainBundle] loadNibNamed:@"Tour" owner:self options:nil];
 // self.view if in a view controller
 [self addSubview:self.tourView]; 

我的猜测是,它可能是指向按钮的指针停止工作的东西,但不是垃圾收集,因为这不会发生

并调试你可能尝试类似:

 for (UIView* view in self.view.subviews)
     if ([view isKindOfClass:[UIButton class]])
     {
               if([self.view respondsToSelector:@selector(myIBAction:)]){
                   NSLog(@"it still sees the method");
                }

         NSLog(@"Button Rect: .2%f, .2%f, .2%f, .2%f", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
      }
正如我在评论中提到的那样

答案 1 :(得分:1)

这是向所有按钮添加选择器的最简单方法。

for (UIView* view in self.view.subviews)
    if ([view isKindOfClass:[UIButton class]])
    {
         //Add selector
    }

答案 2 :(得分:1)

当事情出现问题时重新设定目标,告诉它做错的事情稍微大声或者更加坚持。

您必须找到此问题的原因。运行仪器(Build→Profile),选择Allocations模板并启动应用程序。运行直到问题发生,然后按左上方的红色录音按钮停止在乐器中录音。

在左侧列表中选择分配工具,从时间线正下方窗口跳转栏中的统计数据更改为对象列表。现在,每个要分配,保留,释放和取消分配的对象都有一行。单击小箭头以查看每个对象的历史记录。 (严格来说,它适用于每个内存地址;许多对象可以在应用程序的运行中重复使用相同的内存地址。)您还可以按右上角的任何内容进行过滤,展开右侧边栏以获得所选内容的完整堆栈跟踪。双击条目以关联源代码。

有很多关于乐器的知识;检查文档并搜索Web。但这肯定会告诉你发生了什么,所以你可以推断出它为什么会发生或什么都没发生。