gpt4 book ai didi

SWIFT 线程 1 : Fatal error: Index out of range: Sections & Rows

转载 作者:行者123 更新时间:2023-11-28 13:36:45 32 4
gpt4 key购买 nike

需要一些帮助来获取分组的行以填充它们各自的部分。我让它工作了一秒钟,但试图调整代码以消除重复项和丢失的行。从那以后,我一直收到“ fatal error ”

这是一个练习项目。按部门分组的用户目录。使用 Firebase 拉取用户列表。按部门对它们进行分组,然后填充一个表。

//MARK: - CELLS
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "directoryCell", for: indexPath) as! TableViewCell

let departmentSections = Dictionary(grouping: directoryArray) { (user) -> String in
return user.department
}

//ROW & SECTION SETUP
let rowsInSection = Array(departmentSections.values)
//let usersInRowData = rowsInSection[indexPath.section]
let users = rowsInSection[indexPath.section][indexPath.row]

//USER CELL INFO
let profilePic = users.profilePic // PROFILE PHOTO GET AND DISPLAY
let url = URL(string: profilePic); URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in
if error != nil {
print(error!)
return
}
DispatchQueue.main.async {
cell.profilePicView.image = UIImage(data: data!)
cell.layoutSubviews()
}
}).resume()

//CELL LABELS
cell.displayNameLabel.text = users.displayName
cell.emailLabel.text = users.email
cell.officeLabel.text = users.office
cell.titleLabel.text = users.title
cell.profilePicView.layer.masksToBounds = true;
//cell.profilePicView.contentMode = UIView.ContentMode.scaleAspectFill;
//cell.departmentLabel.text = users.department
//cell.reportsToLabel.text = users.directReports
//cell.extLabel.text = users.ext

cell.layoutSubviews()

return cell
}

我希望用户按部门分组。我得到的只是:“线程 1: fatal error :索引超出范围”

最佳答案

几点:

TableView 或 Collection View 应显示数据数组(一维或二维)。字典是无序的,因此它不适合这两种数据模型。

您当前的代码在每次通过 cellForRowAt 时都会对您的数据模型进行计算密集型重建。您正在使用 Dictionary(grouping:) 构建字典,然后在每次 通过 tableView(_:cellForRowAt: )。你是通过先创建一个字典来做到这一点的,所以这些部分的顺序每次都可能不同。不要那样做。 (这可能是导致崩溃的原因,因为在每次通过 `tableView(_:cellForRowAt:) 时,您的部门数组可能处于不同的顺序,因此每个部分中的用户数量可能不同。

此外,在 tableView(_:cellForRowAt:) 中构建数据模型没有任何意义,因为系统首先调用 numberOfSections(in:) ,然后调用 tableView(_:numberOfRowsInSection:),然后开始调用部分标题和单元格。您没有显示您的 numberOfSections(in:)tableView(_:numberOfRowsInSection:) 方法,但我看不出他们如何返回正确的信息,因为他们的数据模型在首次调用时并未设置。

我建议定义一个节结构数组,并在您首次设置 TableView 时填充一次。

struct SectionStruct: {
let sectionTitle: String //Department name?
let sectionItems: [User]
}

var sections = [SectionStruct]() //populate this as described below

然后,当您首次设置 TableView 时,按部门名称对用户数组进行分组,构建部分结构数组,对该数组进行排序,并将其用作您的数据模型。

现在在您的 numberOfSections 方法中将返回 sections.count

rowsInSection 将返回 sections[section].count

您可以将用于构建数据模型的代码放入directoryArraydidSet 方法中:

var directoryArray: [User] {
didSet {
//Code to group your users by department, build the section structures, and sort them

tableView?.reloadData() //Tell the table view to reload
}

注意:上面的代码更像是伪代码,而不是您可以复制到项目中的实际代码。它旨在为您指明正确的方向。不要试图将它复制到您的项目中并提示它是否(何时)无法编译。

如果您需要更多帮助来重构您的代码,您将不得不发布您的数据结构(例如您的 directoryArray 的类型)和您的 numberOfSections(in:) tableView(_:numberOfRowsInSection:)tableView(_:titleForHeaderInSection:) 数据源方法。编辑您的问题以在底部添加更改的代码。不要试图在评论中发布代码。它没有格式化,因此不可读。

关于SWIFT 线程 1 : Fatal error: Index out of range: Sections & Rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56515182/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com