【问题标题】:UITableView crashing with reloadRowsAtIndexPathsUITableView 因 reloadRowsAtIndexPaths 而崩溃
【发布时间】:2012-07-04 11:34:07
【问题描述】:

我有一个 iPad iOS 应用程序,其中一个表格视图显示在视图的左侧,一个数据输入表单显示在右侧。右侧的数据输入表单由另一个 tableview 组成,单元格内有 UITextFields。

当一个特定的文本字段被更改时,我需要更改左侧表格中的相应行。我正在使用通知进行管理。大多数情况下一切正常,但有时当我尝试更新左侧表格中的特定行时应用程序会崩溃。

左侧 tableview 由与右侧 table 不同的视图控制器管理。

右侧表格文本字段在其视图控制器中具有以下方法:

-(void)textFieldDidChange:(id)sender
{
    switch (((UIView*)sender).tag) {
        case TAG_QE_PAGECAPTIONTEXTFIELD:
            NSLog(@" = = = = = Caption did change %@",((UITextField*)sender).text);
            [getModelForm() updateCurrentPageCaption:((UITextField*)sender).text forLanguage:@"English"];
            [[NSNotificationCenter defaultCenter] postNotificationName: @"pageCaptionWasChanged" object: @"PageEdit"];
            break;

        default:
            break;
    }
}

左侧表格的视图控制器使用以下代码为通知建立一个监听器:

[[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(eventPageCaptionWasChanged:)
     name: @"pageCaptionWasChanged"
     object: nil];

左侧表格的视图控制器则具有以下方法:

-(void)eventPageCaptionWasChanged:(id)alteredText
{

    UITableView* tableView = (UITableView*)[ self.view viewWithTag:TAG_QE_PAGELIST_TABLEVIEW ];
    int row = (int)getModelForm().currentPageNo;
    NSLog(@"HPSQuestionnaireEditorController got eventPageCaptionWasChanged with %@ for row %i",alteredText,row);
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:row inSection:0];
    NSArray* array = [NSArray arrayWithObject:indexPath];
    int modelPageCount = getModelForm().pages.count;
    NSLog(@"eventPageCaptionWasChanged modelPageCount=%i",modelPageCount);
    [tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationFade];

}

应用程序在[tableView reloadRowsAtIndexPaths 行上间歇性崩溃。例外是: * -[UITableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037

谁能帮忙?

非常感谢。

【问题讨论】:

  • 尝试将-(void)eventPageCaptionWasChanged:(id)alteredText 方法中的代码放在try-catch 块中并打印出异常。我在想一个越界异常,但打印它会给我们更多线索。
  • 调试器将异常报告为:*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试从第 0 节中删除第 2 行,在更新前仅包含 2 行”。

标签: objective-c ios uitableview


【解决方案1】:

似乎页码从 1 开始,但表索引从 0 开始,因此当您查找编号为 2 的行时,该表实际上是在搜索第 3 项,即 0、1、2,因此是出现越界异常。

修复它的最简单方法是更改​​此行。

int row = (int)getModelForm().currentPageNo;

到这里

int row = (int)getModelForm().currentPageNo -1;

【讨论】:

  • 非常感谢您的回答。它确实看起来像那种问题,但它实际上不是索引问题(总是有一个额外的第一行添加到表中)。此外,该问题是间歇性的,只会偶尔发生。如果我使用 reloadData 很好(并且表格看起来相同),但如果我尝试只刷新一行则不行。
  • 错误消息告诉您,当最大索引为 1(有 2 行)时,尝试删除行索引 2。当您尝试删除最后一行时,您的应用程序可能总是崩溃。更正索引应该可以解决问题。您也可以转换为现代 obj-c 进行数组初始化等。它更简洁。
  • 要确认您删除了正确的行,请确保项目不同。从“item, item, item”中删除不会显示此类问题。 "item1, item2, item3" 更好。
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2011-03-13
  • 2013-03-09
  • 2015-12-08
相关资源
最近更新 更多