我有一个带有大约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分钟后会发生。
答案 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。但这肯定会告诉你发生了什么,所以你可以推断出它为什么会发生或什么都没发生。