【问题标题】:UISegmentController with UITableviewControllerUISegmentController 和 UITableviewController
【发布时间】:2015-10-20 17:33:40
【问题描述】:

我有一个表视图,它有一个段控制器,它分别有两个段类别 1 和 2。当我将一个项目添加到类别 1 时,它完美地完成了,但是当我将一个项目添加到类别 2 时,它使应用程序崩溃,说'由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序',原因:'尝试将第 0 行插入第 0 节,但更新后第 0 部分只有 0 行。 这是我插入表格视图的代码。

对于第 1 类:

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: NoToDoItem) {
    let newRowIndex = items.count

    items.append(item)

    let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
    let indexPaths = [indexPath]
    tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

    dismissViewControllerAnimated(true, completion: nil)
}

对于第 2 类:

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingNotSureItem notSureItem: NotSureItem) {
    let newRowIndex = notSureItems.count

    notSureItems.append(notSureItem)

    let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
    let indexPaths = [indexPath]
    tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

    dismissViewControllerAnimated(true, completion: nil)
}

【问题讨论】:

  • 那么您创建实例并使用它们填充表格视图的其他代码呢
  • paste.ubuntu.com/12874960。这是我的其他代码@Wain
  • 您似乎没有为第二个类别表填充数据源数组,您是否在委托方法中使用断点进行调试?
  • 尝试使用 beginUpdates() 和 endUpdates() 插入新行。其他一切似乎都很好。
  • 在添加 beginUpdates 和 endUpdates @BhaumikDesai 后它给了我同样的崩溃

标签: ios swift uitableview uisegmentedcontrol


【解决方案1】:

您确定您的表格显示的类别与您当前添加到的类别相同吗?试试这个:

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: NoToDoItem) {
    let newRowIndex = items.count

    items.append(item)
    if segmentBar.selectedSegmentIndex == 0 {
        let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
        let indexPaths = [indexPath]
        tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
    }
    dismissViewControllerAnimated(true, completion: nil)
}

didFinishAddingNotSureItem 做同样的事情。

还要确保在更改类别时重新加载表格视图。

【讨论】:

  • 当我选择类别 1 时,它会添加一个项目,但是当我选择类别 2 时,它不会出现在段索引 1 中 @replman
  • 在 didFinishAddingItem 和 didFinishAddingNotSureItem 中添加断点。然后在类别2中插入一个项目。当调试器停止时,一定要在主线程中。然后在控制台中输入“po segmentBar.selectedSegmentIndex”并验证它是否返回类别 2。
  • 改到2类时,是否调用tableView.reloadData()?
  • “它不可见”是什么意思? notSureItems 数组是否包含条目但 tableview 在类别 2 中保持为空?
【解决方案2】:

UITableView 必须始终与数据源保持同步。如果数据源可以在后台线程中更改,则必须特别小心。

向数据源添加内容后,请尽快调用 beginUpdate/insert/endUpdate。所以试试这个:

tableView.beginUpdates()

let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
let indexPaths = [indexPath]
tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

tableView.endUpdates()

PS:信任您的数据源模型对象 notSureItems 设置正确,并且 numberOfRowsInSection 函数返回正确的计数。

编辑:发布 OP cmets

您试图在错误的索引处添加行。表视图索引从 0 开始,所以这就是你应该如何推断你的新单元格索引:

notSureItems.append(notSureItem)
let newRowIndex = notSureItems.count - 1

另外,在 itemDetailViewControllernumberOfRowsInSection 函数中设置一个断点来检查模型值。

【讨论】:

  • 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后现有节中包含的行数(1)必须相等更新前该节中包含的行数 (1),加上或减去从该节插入或删除的行数(1 插入,0 删除),加上或减去移入或移出该节的行数部分(0 移入,0 移出)。现在它显示了这个崩溃@Abhinav
  • 为了您的信息,我创建了一个警报控制器,它分别具有动作类别 1 和 2。当我选择其中一个类别时,它应该在我创建的那个段内。上面编辑的答案也再次给了我同样的崩溃。
  • 这是什么意思。我被难住了!
  • 正如我之前所说,我怀疑您的表格视图与数据模型不同步。您需要在插入新行之前放置断点并检查数据模型状态。您可以在 beginUpdate endUpdate 块中移动模型更新语句。
  • 看我在主表视图控制器上添加了按钮,分段控制器分段控制有 2 部分类别一和二。当我单击添加按钮时,它会将我推到下一个视图,然后我单击完成按钮以将项目添加到表视图。它会弹出一个警报,您保存在哪个类别中。就是这样
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多