【问题标题】:UITableView row insertion crashUITableView 行插入崩溃
【发布时间】:2013-01-09 14:58:14
【问题描述】:

我正在尝试将行/单元格添加到 tableview,但在 [Table endUpdates] 之前; ...应用程序因错误而崩溃:

* -[UITableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/UIKit-2372/UITableView.m:909 * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试将第 33 行插入第 0 节,但更新后第 0 节中只有 33 行”

-(IBAction)createTask
{
    Data  *sharedManager = [Data sharedManager]; //singleton class
    [Table  beginUpdates];

    [Table insertRowsAtIndexPaths:[NSArray arrayWithObject:
                                          [NSIndexPath indexPathForItem: 
                                                [sharedManager._NAME count] inSection:0]] 
                                          withRowAnimation:UITableViewRowAnimationNone];

     // sharedManager._NAME is NSMutableArray wich consists names for cells
    [Task_handler createTask]; // adds objects to NSMutableArray's 
                               // (like names for cels and so on)

    [Table  endUpdates];
    [Table reloadData];

}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    Data  *sharedManager = [Data sharedManager];
    NSLog(@"numberOfRowsInSection : %d",[sharedManager._NAME count]);

    return [sharedManager._NAME count];
}

提前谢谢你。

【问题讨论】:

  • 你在委托方法中重新计算了行数吗?
  • 是的,我愿意。我已经更新了我的问题。

标签: iphone ios objective-c uitableview


【解决方案1】:

向表格添加行时,您需要让 TableView 知道它有更多的单元格需要管理。在使用insertRowsAtIndexPaths: 之前,您需要运行[TaskHandler createTask] 方法,它将为您的数据源数组创建一个对象。该数组应该是一个实例变量,由您的 TableView 委托方法 numberOfRowsInSection: 计数。

【讨论】:

  • 我已经向上移动 [TaskHandler createTask] 并且我得到了同样的错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试将第 6 行插入第 0 部分,但只有 6 个更新后第 0 节中的行'
【解决方案2】:

通过将代码更改为:

Data  *sharedManager = [Data sharedManager];
[Table  beginUpdates];
[Table insertRowsAtIndexPaths:[NSArray arrayWithObject:
                                          [NSIndexPath indexPathForItem: 
                                                [sharedManager._NAME count] inSection:0]] 
                                      withRowAnimation:UITableViewRowAnimationNone];
[Task_handler createTask];
[Table  endUpdates];

【讨论】:

  • 那么您在问题中写的内容与此答案有什么区别?您只是取出了[Table reloadData] 部分?请解释
【解决方案3】:

这个怎么样:

-(IBAction)createTask
{
    Data  *sharedManager = [Data sharedManager]; //singleton class
    [Table  beginUpdates];
    [Table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForItem: [sharedManager._NAME count]+1 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
    [Task_handler createTask]; //adds objects to NSMutableArray's (like names for cels and so on)
    [Table reloadData];
    [Table  endUpdates];
}

【讨论】:

  • 不需要重新加载数据,也不应该以这种方式调用。我想 UITableView 抱怨是因为他没有更新元素的数量或类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2018-07-15
相关资源
最近更新 更多