UITableView滚动太远,导致奇怪的事情

时间:2009-03-29 23:48:14

标签: iphone cocoa-touch uitableview

我有一个UITableView,当滚动到远处反弹袋时。这也意味着用户可以拖动表格,使其中只有一半可见,而主视图的另一半是白色。这会在我的应用中导致一些奇怪的行为。我在AppDelegate中创建了一个数组。在RootViewController的viewDidLoad中,我获得了对AppDelegate的引用并保持它,直到应用程序关闭。在RootViewController的cellForRowAtIndexPath中,我引用AppDelegate实例的数组来获取将填充单元格标签的对象。这工作正常,直到用户如上所述滚动。一旦发生这种情况,就可以在调试器中看到对象7,例如,在数组中已经变成了UICachedDeviceRGBColor。我不知道为什么会这样。该数组仅在应用程序创建时在AppDelegate中分配一次。它只能从那时开始被引用。

据我所知,我必须先点击表格中的一行。推送新视图,它也有一个UITableView。在第二个视图的cellForRowAtIndexPath中,我检查了delegate.array,因为第二个视图也有对数组的引用。我立即看到数组中的对象2是:

2 : UIDeviceRGBColorSpace 1 1 1 1

它不应该。然后,当我再次单击并再次显示主表时,请执行上述滚动技术以获得奇怪的效果。我滚动表格足以在cellForRowAtIndexPath中点击我的断点,并看到数组已被更改。对象2是正确的类型,但现在对象7不是。

问题在于,如果我尝试访问对象7并在我正在转换的类型上调用属性,那么UICachedDeviceRGBColor上当然不存在该属性。这是一个“Inavlid”,所以我得到了“EXC_BAD_INSTRUCTION”,因为内存访问不好。

在这种特定条件下导致阵列变化的原因是什么?或者至少,我该如何防范呢?

2 个答案:

答案 0 :(得分:4)

这是在设备上,但看起来好像我已经弄明白了。

在RootViewController的didSelectRowAtIndexPath中,我从delegate.thearray中获取了一个对象。就在推出第二个视图之前,我发布了这个对象。那是错的,因为我没有分配对象。删除了该行,阵列中没有更多的怪异。事情似乎正常运作。

答案 1 :(得分:-1)

这是在模拟器还是设备上?

我发现这样的事情只会在模拟器上发生,当我用鼠标上的滚轮滚动表格时。模拟器无法判断您何时释放滚轮,因此不知道何时回弹。然后,当我触摸它时,它将弹回并将我的触摸注册到与我触摸不同的项目上。这在设备上没有发生。当您使用滚动条滚动设备时,它会在您松开后立即弹回,因此在滚动时无法触摸项目。