前言:我是iPhone SDK,Obj-C,Interface Builder和Cocoa的新手.我可能会做一些明显错误的事情.
问题:UITableView
如果滚动它,我会崩溃.它将滚动一点以显示最底部半隐藏单元格的完整单元格,但不会加载下一个单元格.同样,如果我滚过顶部以完全隐藏最底部的单元格,并且橡皮筋向后显示该单元格,它将在显示之前崩溃.这让我感到奇怪,因为它正确地绘制了11个单元格中的前7个单元格.这些单元的数据是在NSArray
,在一个UITableViewController
链接为两个dataSource
和delegate
用于UITableView
在界面生成器.它在视图初始化时有效.
我正在制作一个应用程序我以为我会在2天前完成,只计算组合并在我认为方便的滚动表视图中显示它们的列表.现在,它甚至不计算应有尽有,NSArray
在DataSource
与像一些字符串初始化一次@"Hello"
和@"World"
.
重现的步骤:因为我正在使用IB,所以我无法在代码中向您展示完整的故事.所以我要描述到目前为止我所做的事情并希望它不会让你困倦.
在Xcode中制作了一个新的"Tab Bar Application",因为我想要2个标签,我不想要导航栏或全屏幕表.我把MainWindow.xib
第一个标签视图FirstView.xib
移到了给定的模拟中SecondView.xib
.这很好用.我修改了视图以包含两个UITextField
输入和一个UITableView
输出.这很有效,但桌子是空的.我继承了UITableViewController
其中我填充了一个NSArray
名为combinations
11个字符串的属性,然后添加
// Set up the cell... cell.userInteractionEnabled = NO; cell.text = [combinations objectAtIndex:indexPath.row];
那里只有评论.在IB我添加了一个Table View Controller
到FirstView.xib
,并设置它的类名的名字匹配这个新的子类,并控制拖Table View
在我看来,到这个Combinations Table View Controller
的两倍.一旦连接dataSource
和一次delegate
.虽然只有dataSource
链接才能得到相同的行为.
这将运行并填充表的可见行(6.5),其中包含前七个值dataSource
combinations
.我可以向下滚动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一起工作时,这一点并不清楚.阅读我自己的帖子了解整个过程并修复.
旁白:调试器需要详细的说明(任何链接赞赏),或者它不能很好地工作.通过让App崩溃并阅读它生成的报告,我似乎可以更快地获得更多信息.但这需要一个乏味的终止,重新启动和3次点击.我真的想继续从这里开始连接输入,进行计算,并在每次更改时更新表格.这应该是困难的部分,而不是使框架成员工作的东西.
进一步漫无边际:这完全在iPhone SDK for 2.2.1中.当时没有加入俱乐部以获得冷硬现金的iPhone OS 3.0非测试版尚未推出.我预计它将在WWDC 2009开放,但实际上今天(2009年7月17日)已经提供了免费的公共3.0 SDK.
看起来你正在失去你的tableView委托.
看起来正在发生的是UITableViewDelegate正在发布,然后应用程序使用相同的指针地址为NSCFTimer.
你有没有在你的delegete上调用release,或者如果它在自动释放池中你没有保留该委托.
好的,如果您按照步骤重现,我现在将添加解决此问题的步骤:
解决此问题的步骤
子类a UIViewController
.我打电话给我CombinationsViewController
.在此控制器中,为下面的步骤6 添加一个属性作为IBOutlet .combinations
Table
ViewController
不要忘记导入正确的东西,并合成表视图控制器,也在dealloc
方法中释放它.
在FirstView.xib
改变File's Owner
类到最新的子类.
链接是combinationsViewController出口到Combinations Table View Controller
在FirstView.xib
下面的步骤7发.
TabBarController
在MainWindow.xib
选择第一个选项卡中打开,然后在Identity Inspector中将类更改为最新的子类(CombinationsViewController
).
这使得表格正常填充并滚动内容.
现在我将继续前进,并获得一些自定义表格视图单元格的东西发生,并实际上让我的应用程序做的东西.
枚举重现的步骤作为修复的参考:
在Xcode中制作了一个新的"Tab Bar Application".
打开后Tab View Controller
,将第一个标签的预制视图拖入MainWindow.xib
制作了一个基于xib的新视图,称为FirstView.xib
给定的模拟SecondView.xib
,并将该预制视图放入此xib中.
链接视图到File's Owner
的view
出口.
我修改了视图以包含两个UITextField
输入和一个UITableView
输出.
我将其子类UITableViewController
化为,CombinationsTableView
其中我填充了一个NSArray
名为combinations
11个字符串的属性,然后添加了 cell.text = [combinations objectAtIndex:indexPath.row];
代码,其中只有关于设置单元格的注释.
在FirstView.xib
我添加了一个Table View Controller
并设置它的类名以匹配这个新子类的名称,并Table View
在我的视图中控制拖动到这Combinations Table View Controller
两次.一旦连接dataSource
和一次delegate
.
此时,表格会使用数据进行渲染,但滚动会中断.这是因为CombinationsTableView不会保留在任何位置.对于第一次IB用户来说,这是非常不清楚的.所以你需要应用上面列出的修复程序.
第一个在答案中总结这一点的人会得到正确的答案复选标记.EG创建一个viewController子类,它是FirstView.xib的文件所有者,并包含一个保留的IBOutlet,您可以在同一个xib文件中链接到表视图控制器.