Swift 超出范围.... 使用 tableView[indexPath]

Posted

技术标签:

【中文标题】Swift 超出范围.... 使用 tableView[indexPath]【英文标题】:Swift out of range.... with tableView[indexPath] 【发布时间】:2017-07-14 07:43:53 【问题描述】:

我遇到了range 错误...

错误发生在cell.creditLabel.text = numOfDays[(indexPath as NSIndexPath).row] + "days"

如果我把tableView.reloadData()放在cell.nameLabel.text = nameArray[(indexPath as NSIndexPath).row]之后

然后模拟器中什么都没有显示...

我该如何解决这个问题..?

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return self.nameArray.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell : MoneyTableViewCell = tableView.dequeueReusableCell(withIdentifier: "MoneyTableViewCell", for: indexPath) as! MoneyTableViewCell


    cell.nameLabel.text = nameArray[(indexPath as NSIndexPath).row]

    cell.creditLabel.text = numOfDays[(indexPath as NSIndexPath).row] + "days"
    cell.levelLabel.text = creditArray[(indexPath as NSIndexPath).row]

    cell.layoutIfNeeded()

    return cell

【问题讨论】:

如果我将 tableView.reloadData() 放在 cell.nameLabel.text = nameArray[(indexPath as NSIndexPath).row] 之后,那么模拟器中什么也不会出现......你不应该把 table-view重新加载它。然后它将在无限循环中运行。您不应该强制类型转换为 NSIndexPathm 索引路径行将起作用 “我怎样才能解决这个问题..?”——这就是所谓的调试。数组有多少个元素?您要访问哪个元素?为什么数组的元素比你想象的要少? ...想想! @MartinR 你是对的。我是程序员界的新手,所以我会多练习。感谢您的建议.... 【参考方案1】:

您需要检查您的阵列。从我在这里可以看到,numOfDays 的元素少于nameArray。另外,当你在那里时,请检查creditArray :)

另外,也不需要强制转换为 NSIndexPath

【讨论】:

谢谢。我检查了调试区域,发现我在 nameArray 中有 14 个元素。名称数组和 numOfDays 中应该有 7 个原子,但我仍然不知道为什么有 14 个。 无论如何我只是将 nameArray.count 更改为 creditArray.count 然后现在可以工作了。再次感谢你:) 可能你已经添加到 nameArray 两次。仔细检查数据准备函数。 我还在想办法,但很难找到。我想知道如果我使用 tableView.reloadData(),是否意味着 tableView() 与 cellforRow 再次调用? 是的,reloadData 会调用 cellforRow【参考方案2】:

“numOfDays”数组中的元素数小于“nameArray”数组中的元素数

【讨论】:

我认为发布已经发布的答案不是一个好主意!【参考方案3】:

检查数组中的项目数量是否正确:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return self.nameArray.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell : MoneyTableViewCell = tableView.dequeueReusableCell(withIdentifier: "MoneyTableViewCell", for: indexPath) as! MoneyTableViewCell


    cell.nameLabel.text = nameArray[indexPath.row]

    if numOfDays.count < indexPath.row 
        cell.creditLabel.text = numOfDays[indexPath.row] + "days"
    

    if creditArray.count < indexPath.row 
        cell.levelLabel.text = creditArray[indexPath.row]
    

    return cell

此外,我还删除了 indexPath 和 layoutIfNeeded 的不必要转换(单元格总是会再次绘制,因为它是新的)。

【讨论】:

以上是关于Swift 超出范围.... 使用 tableView[indexPath]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 4 解决 Tableview 数据数组“超出范围值”?

Swift TableView ImageView + Label = 致命错误:索引超出范围

致命错误:注册后索引超出范围(Firebase、Swift)

索引超出范围数据 nil swift 3

SWIFT:为 tableView 计算 numberOfRowsInSection 时,数组索引超出范围

Swift/Xcode - AKPickerView/UIPickerView - 致命错误:索引超出范围