iOS 应用程序在带有滑块的大量表格单元格上崩溃

Posted

技术标签:

【中文标题】iOS 应用程序在带有滑块的大量表格单元格上崩溃【英文标题】:iOS app crashing on high numbers of table cells with sliders 【发布时间】:2017-05-27 10:36:06 【问题描述】:

这里是菜鸟。

我正在使用 Swift 3 在 ios 中以编程方式创建多个 UISliders (globalCount)。grandTotal 浮点值在这些滑块的值之间进行划分,当一个值被更改时,它们都调整为总和为 100% grandTotal。没有滑块低于最小值 0 或高于最大值 100。

对于小于 7 的滑块数量,一切都运行良好。只要我添加 7 个或更多。尝试使用基础结构值更新单元格的滑块值时发生崩溃。

我已将单元格更新功能移至其自己的功能以尝试隔离问题。我仍然会崩溃。崩溃是

EXC_BAD_INSTRUCTION(代码=EXC_1386_INVOP,子代码=0x0)

并出现在let loopCell 行上。

有人对这是什么有任何建议吗?为什么它适用于少量而不是大量细胞?这是有条件的吗?

这是单元格更新函数

func updateCells() 
    for i in 0...globalCount - 1 
        let loopCell: MyTableCell = ((myTableView.cellForRow(at: IndexPath(row:i, section: 0))) as? MyTableCell)!
        loopCell.valueLabel.text = String(structData[i].value)
        loopCell.cellSlider.value = structData[i].value
    

我的用户界面:

【问题讨论】:

【参考方案1】:

cellForRow(at:) 返回nil 如果表格视图单元格不可见(当前不在屏幕上)。您正在崩溃,因为您正在强制解开nil。相反,使用可选绑定 (if let) 来安全地解开值:

func updateCells() 
    for i in 0..<globalCount 
        if let loopCell = myTableView.cellForRow(at: IndexPath(row: i, section: 0)) as? MyTableCell 
            loopCell.valueLabel.text = String(structData[i].value)
            loopCell.cellSlider.value = structData[i].value
        
    

【讨论】:

你为什么说它在屏幕外?还是第二列不在屏幕上? 有根据的猜测。 OP说“添加7个或更多”。我认为他的屏幕空间不足,迫使单元格离开屏幕。 太棒了!谢谢。会试一试【参考方案2】:

这是由于使用强制展开导致崩溃。

最方便的方法是使用 if let 语句来检查数据是否存在,因为 if let 会执行此操作(展开)。

【讨论】:

以上是关于iOS 应用程序在带有滑块的大量表格单元格上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在某些单元格上禁用UITableView滚动

在uitableview单元格上留下滑动删除按钮打开然后返回导致崩溃

iOS 8 中的表格视图单元格自动布局

在 iOS 7 上的导航视图控制器上使用后退手势时,表格视图单元格上没有淡出和淡入动画

iOS Swift - 带有滑块的移动图像

ios UITableview 单个单元格上的多个选择选项?