前言: 我对 iPhone SDK,Obj-C,Interface Builder 和 Cocoa 都是新手。我可能做了一些明显错误的事情。
问题: 我有一个 UITableView
,当我滚动它时会崩溃。它只会滚动一点点来显示最底部半隐藏单元格的完整单元格,但不会加载下一个单元格。同样,如果我滚动到顶部完全隐藏最底部的单元格,并且它反弹回来以显示该单元格,则在显示之前会崩溃。这让我感到奇怪,因为它正确地绘制了前7个单元格中的数据。单元格数据在一个 NSArray
中,在 Interface Builder 中作为 UITableView
的 dataSource
和 delegate
连接到 UITableViewController
中。它在视图初始化时工作正常。
我正在制作一个应用程序,本来以为2天前就能完成,它只是计算组合并在一个方便的可滚动表视图中显示它们的列表。现在,它甚至都没有计算出所有内容,DataSource
中的 NSArray
只初始化了一次,其中包含一些字符串,如 @"Hello"
和 @"World"
。
复现步骤: 因为我在使用 IB,所以无法完全用代码展现整个故事。所以我会描述到目前为止我做了什么,并希望它不会让你昏昏欲睡。
在 Xcode 中新建一个 "Tab Bar Application",因为我想要2个选项卡,而且我不想要导航栏或全屏表格。我将 MainWindow.xib
的第一个选项卡视图移到 FirstView.xib
中作为给定的 SecondView.xib
的类比。这很好地解决了问题。我修改了视图,包含两个 UITextField
用于输入和一个 UITableView
用于输出。这起作用了,但表格是空的。我对 UITableViewController
进行了子类化,在其中填充了一个名为 combinations
的 NSArray
属性,其中包含11个字符串,然后添加了:
// Set up the cell...
cell.userInteractionEnabled = NO;
cell.text = [combinations objectAtIndex:indexPath.row];
在这里只有评论。我在IB中向FirstView.xib
添加了一个Table View Controller
,并将其类名设置为与此新子类的名称匹配,并将我的视图中的Table View
拖到这个Combinations Table View Controller
上两次。一次链接dataSource
和一次链接delegate
。如果只链接dataSource
,则会获得相同的行为。
这将运行并使用dataSource
combinations
的前7个值填充表格的可见行(6.5)。我可以向下滚动0.5个单元格,然后向上滚动。但是,如果我向上或向下滚动超过0.5个单元格,应用程序将崩溃。报告中的解释如下:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSCFTimer tableView:cellForRowAtIndexPath:]:
unrecognized selector sent to instance 0x52ca40'
我没有创建一个NSCFTimer
,也没有将其链接到我的Table View
,我怀疑cellForRowAtIndexPath
实际上应该是应该传递给我的dataSource
或delegate
的消息,所以我很困惑它为什么会偏离轨道,并最终到达了哪里。
更新:感谢回答和评论。我的问题似乎是CombinationsTableViewController
(UITableViewController
的子类)实际上没有在我的代码中任何特定的地方实例化。它确实在某个时候被创建(当加载FirstView.xib
时),并且在初始tableView填充7个单元格时显然是受管理的,然后被释放。因此,我需要确定在哪里/如何制作对此控制器的保留引用。我的Application Delegate
可能应该有一些持有此控制器的输出口,可以将其链接为在xib
中的实例。是的,我是新手。我知道我可以通过避免IB并在代码中明确执行操作来消除这些麻烦,但我认为我想学会灵活使用IB。
最后:是的,我需要一个保留的表视图控制器实例。听起来很基础,但这在使用IB时并不明显。阅读我的帖子以了解整个过程和修复方法。
旁白:无论是调试器需要详细的说明(任何链接都会有所赞赏),还是它并不起作用。我似乎通过让应用程序崩溃并阅读它生成的报告来更快地获得更多信息。但这需要繁琐的终止、重新启动和3次单击。我真的想摆脱这个问题,转而进行输入电缆的接线、计算和每次更改后都更新表格。那才是难点,而不是使框架成员工作。
进一步的胡言乱语:这些都是在iPhone SDK 2.2.1中完成的。当时,没有免费的公共3.0 SDK可用,除非你为冷酷的现金加入俱乐部。我期望它在WWDC 2009开幕时就已经发布了,但事实上,直到今天(2009年7月17日)才发布了免费的公共3.0 SDK。