gpt4 book ai didi

ios - 旋转设备时表格 View 更新无效

转载 作者:行者123 更新时间:2023-11-29 03:44:35 24 4
gpt4 key购买 nike

我正在使用我认为向表格 View 添加项目的常见模式 -

  • 主 Controller 创建模态 Controller 并将自身注册为委托(delegate)
  • 呈现模态视图 Controller
  • 用户提供一些数据并点击模式导航栏中的“保存”按钮
  • 模态视图 Controller 向其委托(delegate)发送一条包含输入详细信息的消息
  • 原始 Controller 收到消息并关闭模式
  • 原始 Controller 更新数据模型并将新行插入其 TableView

除一种特定场景外,此方法运行良好。

如果在显示模式时旋转设备,则应用程序会在关闭模式后崩溃。新行已正确插入,但随后立即失败:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], 

/SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:1070
2013-07-28 17:28:36.404 NoHitterAlerts[36541:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (8) must be equal to the number of rows contained in that section before the update (8), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

我一生都无法弄清楚为什么会发生这种情况。如果我按照所呈现的模式进行旋转,则始终有效的测试用例会失败。我注意到,只需重新加载表格 View 而不是插入带有动画的行就可以了。

这是一个演示相同问题的基本项目: demo project

  1. 在 iPhone sim 中运行项目
  2. 将项目添加到列表 - 工作正常
  3. 返回第一个屏幕,旋转至横向
  4. 再次运行相同的测试。仍然有效。
  5. 返回第一个屏幕,启动模式。 在模态仍然显示的情况下旋转模拟器。点击“添加项目”。崩溃。

对这里可能发生的事情有什么想法吗?

最佳答案

我明白你的问题是什么了。在你的 MainController 的 -modalController:didAddItem: 中方法中,您首先将该对象添加到 self.arrayOfStrings ,并且直到 -dismissViewControllerAnimated 之后才将行插入到 tableView 中方法已完成。

当 modalViewController 打开时方向未更改时,这似乎有效,但是如果您更改方向,则 mainController 的方向在关闭之前不会更改。一旦发生这种情况,似乎tableView的数据由于框架被改变而自动重新加载。

因此,因为 arrayOfStrings 在动画开始之前添加了对象,并且 -insertRowsAtIndexPaths:withRowAnimation:直到动画完成后才调用, TableView 认为在到达插入方法时它已经获取了行。

为了解决这个问题,您所要做的就是在调用 tableView 上的 insertRows 方法之前,将用于将字符串添加到数组的方法移动到完成 block 中。

因此,您的方法最终将类似于以下内容,并根据您的实际项目进行任何更改:

- (void)modalController:(ModalController *)controller didAddItem:(NSString *)string
{

//dismiss the modal and add a row at the correct location
[self dismissViewControllerAnimated:YES completion:^{
[self.arrayOfStrings addObject:string];
[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.arrayOfStrings.count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];

}];
}

关于ios - 旋转设备时表格 View 更新无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17913423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com