How to solve Fatal error: Index out of range in Xcode Swift IOS

How to solve Fatal error: Index out of range in Xcode Swift IOS

我想知道为什么这段代码显示索引超出范围

具体问题代码:

cell.textLabel?.text = contactsAry[indexPath.row]

整个代码有问题:

extension ContactsViewController: UITableViewDataSource, UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return (myContact.count + contactsAry.count)
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        
         if indexPath.row < myContact.count {
            let contact = myContact[indexPath.row]
            
            let cell = tableView.dequeueReusableCell(withIdentifier: "MainUsersAccount") as!
            ContactsLayout
            
            cell.setContacts(contacts: contact)
            
            return cell

        } else {

        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "UserItem")
        cell.textLabel?.text = contactsAry[indexPath.row]

        return cell
        }
    }

这是我的数组“contactsAry”let contactsAry = ["Brandon", "Luisa"]

MainUserAccount 设置代码:

    func createArray() -> [Contacts] {
        var tempContact: [Contacts] = []
        
        let userName = "Temp User"
        
        let myContact = Contacts(UserIcon: UIImage(systemName: "\(userName.prefix(1).lowercased()).circle.fill")!, UserName: userName, MyAccountLabel: "My Account")
        
        tempContact.append(myContact)
        
        return tempContact
    }

我有两个不同的原型单元格试图添加到同一个 tableView。第一个基本上只是用户帐户单元格的单元格被标识为“MainUserAccount”,它只是一个可以更改其图标和名称的单元格。第二个单元格被标识为“UserItem”,它基本上只是您添加到“朋友列表”中的用户列表。我不确定为什么会不断收到此错误。任何帮助将不胜感激。

我在控制台中得到的完整错误代码:

Fatal error: Index out of range: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444 2020-08-02 03:04:18.896635-0700 Schedule[44839:2131710] Fatal error: Index out of range: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444

欢迎使用 Whosebug!错误:

Fatal error: Index out of range: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444 2020-08-02 03:04:18.896635-0700 Schedule[44839:2131710] Fatal error: Index out of range: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, line 444

基本上意味着您正在访问数组索引,但该索引大于数组的最大索引。


如您所知,访问数组是从 0 开始的。 从 IndexPath 获取索引是通过 rowitemsection。 获取数组最大索引的方法是通过数据数组的计数减去 1。


据我所知,就像你说的,你有两种不同的细胞。您在 cellForRow 中处理它的方式可能是正确的,但是您传递给 numberOfRowsInSection 的值太多了,您正在合并两个数组的计数。

return (myContact.count + contactsAry.count)

总和 - 1 将是最大值 indexPath.row 您的 tableView 将尝试访问,因此崩溃(超出范围)。


解决此问题的一种方法是利用该部分。例如,您可以这样做:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    if section == 0 {
        return myContact.count
    } else {
        return contactsAry.count
    }
}

为此,您需要另一种方法 numberOfSections

func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

然后,在 cellForRow 中以相同的方式处理部分和行。你可以从这里拿走它。

你可以做的是删除珍贵数组的计数...否则它将尝试访问第 3 个实例而不是 0

let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "UserItem")
        cell.textLabel?.text = contactsAry[indexPath.row - myContact.count]