【发布时间】:2012-08-01 13:21:33
【问题描述】:
我有一个 UIView,其中包含大约 60 个调用相同方法的按钮。单击按钮时,我通过这种方法打开不同的图像 - 我使用按钮标签来了解调用了哪个按钮以及要显示哪个图像。把它想象成一个画廊。
由于按钮的绘制很困难,我为此使用了 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 目标的破坏之间的联系。内存警告确实出现在我的应用程序中,但大多数时候按钮仍然有效。
但它必须是垃圾收集器,因为错误完全随机出现。无法重现此错误,有时在单击 5 次后发生,有时在我的应用程序中花费 10 分钟后发生。
【问题讨论】:
-
如果您使用 ARC,则没有垃圾收集,并且按钮与当前视图有很强的链接。如果您不使用 ARC,那么可能是您在释放对象。你所描述的没有任何明显的问题;您需要添加更多细节。
-
抱歉,描述起来有点复杂。是的,我正在使用 ARC,我只是再次检查了我的项目以确定。不,我不释放我的任何物品。我注意到:当我以编程方式添加选择器时,它会继续工作。所以问题出在某种程度上与 IB 连接的方式有关。我确实可以通过编程方式解决这个问题,但是对于超过 60 个按钮来说,这还有很长的路要走......
-
将按钮添加到数组中,然后使用 for 循环添加选择器。
-
Dustin:可以选择,但我需要通过 IB 手动连接它们,对吧?不是很优雅,但当然可以。还是有更好的选择?
标签: ios objective-c uibutton action programmatically-created