在cellForRowAt中显示正确的信息

时间:2017-12-07 22:43:23

标签: swift uitableview core-data

我认为我已经接近了,但似乎让我自己感到困惑,因为我可以访问所有数据,但无法让它表现出来。

我正在尝试在表格视图的表格中显示各自公司(部分)下的员工列表。

关于存储的值和关系,我的CoreData是正确的。我通过在各个地方使用print语句来了解这一点。

以下是我的代码,但有关cellForRowAt方法的问题摘要是......

  1. 我可以使用print("Company - \(company.name!) Employee - \(employee.name!)")打印公司及其员工的列表
    • 公司 - 公司1员工 - Fred Smith
    • 公司 - 公司1员工 - Betty Boo
    • 公司 - 公司2员工 - GI Joe
    • 公司 - 公司3员工 - George Jungle
  2. 如果我设置cell.textLabel?.text = allCompanies[indexPath.section].name,我会在每个部分中获得正确的行数(基于每个公司的employee.count),但每个部分显示每行的公司名称
  3. 如果我设置cell.textLabel?.text = employee.name!,我只会让所有行返回一名员工。所有部门都是同一名员工。
  4. CoreData实体

    实体 - 公司
    属性 - 名称
    关系 - hasEmployee

    实体 - 员工
    属性 - 名称
    关系 - hasCompany

    var allCompanies: [Company] = []
    
    func getCompanies() {
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Company")
        request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
        request.returnsObjectsAsFaults = false
    
        do {
            allCompanies = try moc.fetch(request) as! [Company]
        } catch let err {
            print(err)
        }
    }
    
    //MARK: - Fetched Results
    lazy var fetchedResultsController: NSFetchedResultsController = { () -> NSFetchedResultsController<Employee> in
    
        let fetchRequest: NSFetchRequest<Employee> = Employee.fetchRequest()
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
    
        let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
        frc.delegate = self
        return frc
    }()
    
    func attemptFetch() {
    
        do {
            try fetchedResultsController.performFetch()
        } catch let err {
            print(err)
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! EmployeeCell
    
        for company in allCompanies {
            for employee in company.hasEmployee?.allObjects as! [Employee] {
    
    //                print("Company - \(company.name!)  Employee - \(employee.name!)")
    //                cell.textLabel?.text = employee.name!
                    cell.textLabel?.text = allCompanies[indexPath.section].name
                }
            }
            return cell
        }
    

    非常感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:1)

如果您想将func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! EmployeeCell let company = allCompanies[indexPath.section] let allEmployees = company.hasEmployee?.allObjects as! [Employee] let employee = allEmployees[indexPath.row] cell.textLabel?.text = employee.name return cell } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let company = allCompanies[section] return company.name } 个实例用作部分,将员工用作您可能编写的行

NSFetchedResultsController

但我建议使用hasEmployees的功能来处理各个部分。

PS:数组的命名has令人困惑,因为通常前缀isBool表示employees。只需将其命名为new Date('1990-03-31T23:00:00-06:00')并将数组(实际上是一组)声明为非可选项。