tableView reloadData 导致应用在删除部分后崩溃
Posted
技术标签:
【中文标题】tableView reloadData 导致应用在删除部分后崩溃【英文标题】:tableView reloadData causes app to crash after section is deletedtableView reloadData 导致应用在删除部分后崩溃 【发布时间】:2011-06-08 02:50:10 【问题描述】:我在方法中以编程方式定义了一个自定义标题视图:
ViewForHeaderInSection
自定义视图内部是一个 UIButton,它有一个目标操作 method:"foodDeleteButtonPressed"
。我还将按钮的标签变量设置为节号。
这是该方法的实现
-(void)foodDeleteButtonPressed:(id)sender
NSInteger index = [sender tag];
NSLog(@"Delete button pressed for section: %d", index);
FoodItem *tmpItem = [Cart.foodItemsArray objectAtIndex:index];
int ct = [tmpItem.sidesArray count];
if(ct > 0)
NSLog(@"About to delete %d sides", ct);
[tmpItem.sidesArray removeAllObjects];
else
NSLog(@"The fooditem to be deleted has no side items");
NSLog(@"About to remove object from ffod items array");
[Cart.foodItemsArray removeObjectAtIndex:index];
[self.myOrderTable reloadData];
这个方法在没有行的情况下执行得很好:
[self.myOrderTable reloadData];
在删除部分后尝试重新加载数据来刷新视图的那一刻。 我的应用程序因以下堆栈跟踪而崩溃:
* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[NSMutableArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]” *** 首次抛出时调用堆栈: ( CoreFoundation 0x010325a9 __exceptionPreprocess + 185 libobjc.A.dylib 0x01186313 objc_exception_throw + 44 CoreFoundation 0x010280a5 -[__NSArrayM objectAtIndex:] + 261 餐厅 0x00015c77 - [MyOrderViewController tableView:viewForHeaderInSection:] + 827 UIKit 0x0038de48 -[UITableView(UITableViewInternal) _delegateWantsHeaderForSection:] + 152 UIKit 0x004d8c01 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 116 UIKit 0x004d6d88 -[UITableViewRowDatanumberOfRows] + 108 UIKit 0x0038a677 -[UITableViewnoteNumberOfRowsChanged] + 132 UIKit 0x00397708 -[UITableView reloadData] + 773 餐厅 0x00011eac -[MyOrderViewControllerfoodDeleteButtonPressed:] + 444 UIKit 0x0031c4fd -[UIApplicationsendAction:to:from:forEvent:] + 119 UIKit 0x003ac799 -[UIControlsendAction:to:forEvent:] + 67 UIKit 0x003aec2b -[UIControl(Internal)_sendActionsForEvents:withEvent:]
重载数据抛出异常。我该如何解决?任何建议,将不胜感激。
【问题讨论】:
【参考方案1】:当您删除对象时,您是否减少了您的表委托报告的表中存在的项目数?
这一行:
餐厅 0x00015c77 - [MyOrderViewController tableView:viewForHeaderInSection:] + 827
正在对数组执行 objectAtIndex,可能是您刚刚从中删除条目的数组。我猜它要求的数组元素比现有的多一个。
【讨论】:
我会在哪里做呢?我应该发布我的 viewforheaderinsection 功能代码吗? developer.apple.com/library/ios/#documentation/UIKit/Reference/…【参考方案2】:!!! [Cart.foodItemsArray removeObjectAtIndex:index]; !!!
这可能是在尝试删除不存在的索引时发生的
【讨论】:
【参考方案3】:检查是否
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
或
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
返回正确的值(可能有NAN)
【讨论】:
以上是关于tableView reloadData 导致应用在删除部分后崩溃的主要内容,如果未能解决你的问题,请参考以下文章
删除 CoreData 对象,然后调用 [tableView reloadData] 会导致 SIGABRT
[tableView reloadData] 和 runloop
_tableView reloadData 使我的应用程序崩溃
如何让 tableView.reloadData() 与核心数据正常工作?