当前位置:  开发笔记 > IOS > 正文

UITableView滚动崩溃App

如何解决《UITableView滚动崩溃App》经验,为你挑选了2个好方法。

前言:我是iPhone SDK,Obj-C,Interface Builder和Cocoa的新手.我可能会做一些明显错误的事情.

问题:UITableView如果滚动它,我会崩溃.它将滚动一点以显示最底部半隐藏单元格的完整单元格,但不会加载下一个单元格.同样,如果我滚过顶部以完全隐藏最底部的单元格,并且橡皮筋向后显示该单元格,它将在显示之前崩溃.这让我感到奇怪,因为它正确地绘制了11个单元格中的前7个单元格.这些单元的数据是在NSArray,在一个UITableViewController链接为两个dataSourcedelegate用于UITableView在界面生成器.它在视图初始化时有效.

我正在制作一个应用程序我以为我会在2天前完成,只计算组合并在我认为方便的滚动表视图中显示它们的列表.现在,它甚至不计算应有尽有,NSArrayDataSource与像一些字符串初始化一次@"Hello"@"World".

重现的步骤:因为我正在使用IB,所以我无法在代码中向您展示完整的故事.所以我要描述到目前为止我所做的事情并希望它不会让你困倦.

在Xcode中制作了一个新的"Tab Bar Application",因为我想要2个标签,我不想要导航栏或全屏幕表.我把MainWindow.xib第一个标签视图FirstView.xib移到了给定的模拟中SecondView.xib.这很好用.我修改了视图以包含两个UITextField输入和一个UITableView输出.这很有效,但桌子是空的.我继承了UITableViewController其中我填充了一个NSArray名为combinations11个字符串的属性,然后添加

// Set up the cell...
cell.userInteractionEnabled = NO;
cell.text = [combinations objectAtIndex:indexPath.row];

那里只有评论.在IB我添加了一个Table View ControllerFirstView.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正是应该去我的消息dataSourcedelegate使我在为什么它迷路了困惑和它结束了下去.

更新:感谢您的回答和评论.我的问题似乎是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.



1> Bluephlame..:

看起来你正在失去你的tableView委托.

看起来正在发生的是UITableViewDelegate正在发布,然后应用程序使用相同的指针地址为NSCFTimer.
你有没有在你的delegete上调用release,或者如果它在自动释放池中你没有保留该委托.



2> dlamblin..:

好的,如果您按照步骤重现,我现在将添加解决此问题的步骤:

解决此问题的步骤

    子类a UIViewController.我打电话给我CombinationsViewController.在此控制器中,为下面的步骤6 添加一个属性作为IBOutlet .combinationsTableViewController

    不要忘记导入正确的东西,并合成表视图控制器,也在dealloc方法中释放它.

    FirstView.xib改变File's Owner类到最新的子类.

    链接是combinationsViewController出口到Combinations Table View ControllerFirstView.xib下面的步骤7发.

    TabBarControllerMainWindow.xib选择第一个选项卡中打开,然后在Identity Inspector中将类更改为最新的子类(CombinationsViewController).

这使得表格正常填充并滚动内容.

现在我将继续前进,并获得一些自定义表格视图单元格的东西发生,并实际上让我的应用程序做的东西.

枚举重现的步骤作为修复的参考:

    在Xcode中制作了一个新的"Tab Bar Application".

    打开后Tab View Controller,将第一个标签的预制视图拖入MainWindow.xib

    制作了一个基于xib的新视图,称为FirstView.xib给定的模拟SecondView.xib,并将该预制视图放入此xib中.

    链接视图到File's Ownerview出口.

    我修改了视图以包含两个UITextField输入和一个UITableView输出.

    我将其子类UITableViewController化为,CombinationsTableView其中我填充了一个NSArray名为combinations11个字符串的属性,然后添加了 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文件中链接到表视图控制器.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有