如何从获取请求数组结果中构建字典?
how to build a dictionary from the fetch request array result?
我无意中设置了一个 table 视图,其中包含基于实体属性和数字的多个部分。基于同一实体的另一个属性的单元格。我有一个名为 Floors 的实体(可以存在多个实例),它有 2 个属性:楼层数和楼层上的房间数。我已经执行了一个获取请求,它 return 数组。我的知识不足以弄清楚如何设置这样的字典:[floorNumber: numberOfRoomsInFloor] 所以我可以接受它并定义 table 中的部分数和每个部分中的行数。我尝试过但失败了,我确实查看了网站上的线程,但我没有真正看到适合我的解决方案。如果有人能花点时间帮助我,那对我来说意义重大。请在下面查看我的代码:
class RoomAndAlarmTypeTableVC: UITableViewController, NSFetchedResultsControllerDelegate {
//MARK: - Properties
private var managedObjectContext: NSManagedObjectContext!
private var storedFloors = [Floors]()
private var floorsAndRooms = [String: String]()
//MARK: - Actions
override func viewDidLoad() {
super.viewDidLoad()
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
loadFloorData()
tableView.delegate = self
tableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
private func loadFloorData() {
let floorRequest: NSFetchRequest<Floors> = Floors.fetchRequest()
do {
storedFloors = try managedObjectContext.fetch(floorRequest)
print("\(storedFloors)")
} catch {
print("could not load data from core \(error.localizedDescription)")
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return storedFloors.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let specificFloor = storedFloors[section]
return Int(specificFloor.numberOfRooms)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "house cell", for: indexPath) as! ViewRooomNumberCell
let tableSections = storedFloors[indexPath.section]
let floorItem = tableSections.numberOfRooms[indexPath.row]
let floorNumber = String(floorItem.numberOfRooms)
cell.floorNumberTxt.text = floorNumber
return cell
}
}
假设 storedFloors 包含所有楼层(部分),您不需要字典,只需使用:
override func numberOfSections(in tableView: UITableView) -> Int {
return storedFloors.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// this will return the proper number of rows (rooms) for each section
return storedFloors[section].numberOfRooms
}
我无意中设置了一个 table 视图,其中包含基于实体属性和数字的多个部分。基于同一实体的另一个属性的单元格。我有一个名为 Floors 的实体(可以存在多个实例),它有 2 个属性:楼层数和楼层上的房间数。我已经执行了一个获取请求,它 return 数组。我的知识不足以弄清楚如何设置这样的字典:[floorNumber: numberOfRoomsInFloor] 所以我可以接受它并定义 table 中的部分数和每个部分中的行数。我尝试过但失败了,我确实查看了网站上的线程,但我没有真正看到适合我的解决方案。如果有人能花点时间帮助我,那对我来说意义重大。请在下面查看我的代码:
class RoomAndAlarmTypeTableVC: UITableViewController, NSFetchedResultsControllerDelegate {
//MARK: - Properties
private var managedObjectContext: NSManagedObjectContext!
private var storedFloors = [Floors]()
private var floorsAndRooms = [String: String]()
//MARK: - Actions
override func viewDidLoad() {
super.viewDidLoad()
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
loadFloorData()
tableView.delegate = self
tableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
private func loadFloorData() {
let floorRequest: NSFetchRequest<Floors> = Floors.fetchRequest()
do {
storedFloors = try managedObjectContext.fetch(floorRequest)
print("\(storedFloors)")
} catch {
print("could not load data from core \(error.localizedDescription)")
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return storedFloors.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let specificFloor = storedFloors[section]
return Int(specificFloor.numberOfRooms)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "house cell", for: indexPath) as! ViewRooomNumberCell
let tableSections = storedFloors[indexPath.section]
let floorItem = tableSections.numberOfRooms[indexPath.row]
let floorNumber = String(floorItem.numberOfRooms)
cell.floorNumberTxt.text = floorNumber
return cell
}
}
假设 storedFloors 包含所有楼层(部分),您不需要字典,只需使用:
override func numberOfSections(in tableView: UITableView) -> Int {
return storedFloors.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// this will return the proper number of rows (rooms) for each section
return storedFloors[section].numberOfRooms
}