在我的表格视图中设置单元格时索引超出范围

Posted

技术标签:

【中文标题】在我的表格视图中设置单元格时索引超出范围【英文标题】:Index beyond bounds while setting up a cell in my table view 【发布时间】:2017-07-05 13:57:34 【问题描述】:

在我的表格视图中设置单元格时,我遇到了这个问题:

日志:

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]” *** 首先抛出调用堆栈: (0x18696afd8 0x1853cc538 0x1868491f0 0x100918a30 0x10091960c 0x18cddf114 0x18cddf32c 0x18cdcca30 0x18cde431c 0x18cb7c92c 0x18ca97158 0x189c87274 0x189c7bde8 0x189c7bca8 0x189bf7360 0x189c1e3c0 0x189c1ee8c 0x1869189a0 0x186916628 0x186846db4 0x1882b0074 0x18caff130 0x1006920bc 0x18585559c) libc++abi.dylib:以 NSException 类型的未捕获异常终止

internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if (tableView == tableview) 
        let cell = tableView.dequeueReusableCell(withIdentifier: "table", for: indexPath as IndexPath) as! homeTableViewCell

        if (titlearray.count != 0) 
            let tit: NSString = self.titlearray[indexPath.row] as! NSString

            print("titlearraytitlearray\(titlearray)")

            appDelegate.trendseetitarray = titlearray

            print("appDelegatetrendseearray\(appDelegate.trendseetitarray)")

            cell.treadingtitle.text! = tit as String
        

        if (pricearray.count != 0) 
            let tit: NSString = self.pricearray[indexPath.row] as! NSString

            appDelegate.trendseepricearray = pricearray

            cell.trendingprice.text! = tit as String
        

        if (addressarraylist.count != 0) 
            let tit: NSString = self.addressarraylist[indexPath.row] as! NSString

            appDelegate.addressarraylist = addressarraylist
        

        if (imagearray.count != 0 && imagearray.count != nil ) 
            print(imagearray)

            let roomurl=URL(string: "\(imagearray[indexPath.row])")
            //  print("Room URL:\(roomurl!)")
            appDelegate.trendseeimagearray = imagearray

            cell.Trendingimg.sd_setImage(
                with: roomurl,
                placeholderImage: UIImage(named:"no_image.png"),
                options: SDWebImageOptions.refreshCached,
                completed:  (image1: UIImage?, error1: Error?, cacheType1: SDImageCacheType, imageURL1: URL?) -> Void in
                
            )

            cell.Trendingimg.clipsToBounds = true;
            cell.Trendingimg.sd_setImage(with: roomurl, completed: self.block1)
        

        return cell
    

    return UITableViewCell()

错误:

if (addressarraylist.count != 0) 
    let tit: NSString = self.addressarraylist[indexPath.row] as! NSString

    appDelegate.addressarraylist = addressarraylist

作为图片问题:

【问题讨论】:

检查你的数组对象计数 这是因为indexPath.row = 5addressarraylist.count = 5(从索引0到4),当你这样访问时addressarraylist[indexPath.row] = addressarraylist[5] => 错误 强烈建议您不要使用多个数组作为数据源。如果 all 数组中的项目数不相等,则会出现这种异常。 Swift 是一种面向对象的语言。好好利用它。并且不要在 Swift 中使用 NSString。使用原生String 【参考方案1】:

你可以试试这个:-

if self.addressarraylist.count > indexPath.row 
    let tit: NSString = self.addressarraylist[indexPath.row] as! NSString
    appDelegate.addressarraylist = addressarraylist
 

【讨论】:

这个答案几乎就是我之前给出的一两个小时的same one,只是对比一下。【参考方案2】:

为什么要检查 Array 的大小是否非零,而不是检查计数是否至少与 indexPath.row 一样大?试试这个:

// array index must be less than the count since the index is zero-based
if indexPath.row < addressarraylist.count 
  let tit: NSString = addressarraylist[indexPath.row] as! NSString
  appDelegate.addressarraylist = addressarraylist

您还应该在打开 Optional 值之前对其进行测试。强制展开可能会导致运行时崩溃。像这样测试它们:

if let tit: NSString = addressarraylist[indexPath.row] as? NSString  ... 

【讨论】:

整个向下转换是无意义的,因为表视图数据源数组应该只包含具有不同类型的非可选值。我猜 OP 使用无类型 NSArray 是的,我同意在这种情况下转换为 NSString 可能没有必要。我只是将它作为如何安全地转换和处理Optional 值的一个例子——运行时崩溃的另一个来源。如果您查看异常,则 OP 确实在使用 NSArray 我知道,我不是在冒犯你。 我知道你不是。如果不在代码中引入其他问题,就很难回答问题并保持答案准确。这是一种平衡的行为,你在一个答案中纠正了多少,而不至于太远?

以上是关于在我的表格视图中设置单元格时索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

当我使用单元格时索引超出范围(Swift)

来自数组索引的表视图超出范围

表格视图单元格中的 uicollectionview 出现错误:索引超出范围,为啥?

删除 UITableView 中的最后一个单元格时索引超出范围

updateSearchResults 方法中 didSelectRow 的索引超出范围

快速避免索引超出范围错误