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
获取索引是通过 row
或 item
和 section
。
获取数组最大索引的方法是通过数据数组的计数减去 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]
我想知道为什么这段代码显示索引超出范围
具体问题代码:
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
获取索引是通过 row
或 item
和 section
。
获取数组最大索引的方法是通过数据数组的计数减去 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]