不同对象的 UITableViewDiffableDataSource 和 NSDiffableDataSourceSnapshot 只显示一行

UITableViewDiffableDataSource and NSDiffableDataSourceSnapshot for different objects shows only one row

我已经使用 UITableViewDiffableDataSourceNSDiffableDataSourceSnapshot 实现了 UITableView,例如

    private typealias ListDataSource = UITableViewDiffableDataSource<Section, Wrapper> 
    private typealias ListSnapshot = NSDiffableDataSourceSnapshot<Section, Wrapper>


 enum Wrapper: Hashable {
    case one([Company])
    case two([Member])
}

private enum Section: CaseIterable {
    case main
}

private func configureDataSource() {

        dataSource = ListDataSource(tableView: listTableView,
                                    cellProvider: { [weak self] (_, indexPath, wrapper) -> UITableViewCell? in

                                        guard let `self` = self else {
                                            return UITableViewCell()
                                        }
                                        switch wrapper {

                                        case .one(let company):
                                            let cell = self.listTableView.dequeueReusableCell(withIdentifier: "Cell",
                                                                                              for: indexPath)
                                            cell.textLabel?.text = company[indexPath.row].name
                                            return cell
                                        case .two(let member):

                                            let cell = self.listTableView.dequeueReusableCell(withIdentifier: "Cell",
                                                                                              for: indexPath)
                                            cell.textLabel?.text = member[indexPath.row].name.first
                                            return cell
                                        }
        })

    }

func updateData(_ wrapper: Wrapper) {
        var snapshot = ListSnapshot()
        snapshot.appendSections([.main])

        switch  wrapper {
        case .one(let comp):
            snapshot.appendItems([.one(comp)])
            dataSource.apply(snapshot, animatingDifferences: true)
        case .two(let member):
            snapshot.appendItems([.two(member)])
            dataSource.apply(snapshot, animatingDifferences: true)
        }
    }

on segment change, updating data respective of Wrapper type. But the issue is only one record displayed every time.

func handleSegmentChanged(_ sender: UISegmentedControl) {

   

 let member = Member(name: Name(first: "Harshal", last: "Wani"),
                        memberId: "123", age: 30, email: "harshal@gmail.com", phone: "123456789")
    let member2 = Member(name: Name(first: "David", last: "John"),
                        memberId: "123", age: 30, email: "harshal@gmail.com", phone: "123456789")

    let comp = Company(name: "Comp 1", companyId: "", website: "", logo: "", about: "", members: [member, member2])
    let comp2 = Company(name: "Comp 2", companyId: "", website: "", logo: "", about: "", members: [member, member2])

    if sender.selectedSegmentIndex == 0 {
        updateData(.one([comp, comp2]))
    } else {
        updateData(.two(comp.members))
    }
}

感谢任何帮助,谢谢

您每个部分只应用一个项目,您必须声明包装器

enum Wrapper: Hashable {
    case one(Company)
    case two(Member)
}

handleSegmentChanged 中创建 array Wrapper 项而不是 one Wrapper关联类型的数组。

@IBAction func handleSegmentChanged(_ sender: UISegmentedControl) {
    
    let member = Member(name: Name(first: "Harshal", last: "Wani"), memberId: "123", age: 30, email: "harshal@gmail.com", phone: "123456789")
    let member2 = Member(name: Name(first: "David", last: "John"), memberId: "123", age: 30, email: "harshal@gmail.com", phone: "123456789")
    
    let comp = Company(name: "Comp 1", companyId: "", website: "", logo: "", about: "", members: [member, member2])
    let comp2 = Company(name: "Comp 2", companyId: "", website: "", logo: "", about: "", members: [member, member2])
    
    if sender.selectedSegmentIndex == 0 {
        updateData([.one(comp), .one(comp2)])
    } else {
        updateData(comp.members.map{.two([=11=])})
    }
}

并将updateData替换为

func updateData(_ wrapper: [Wrapper]) {
    var snapshot = ListSnapshot()
    snapshot.appendSections([.main])
    snapshot.appendItems(wrapper)
    dataSource.apply(snapshot, animatingDifferences: true)
}

configureDataSource中的[weak self] -> self舞蹈是胡说八道。闭包的第一个参数是 table 视图。使用此实例可避免出现 self 并将 configureDataSource 替换为

 private func configureDataSource() {
    
    dataSource = ListDataSource(tableView: listTableView,
                                cellProvider: { (tableView, indexPath, wrapper) -> UITableViewCell? in
                                    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell",
                                                                                        for: indexPath)
                                    switch wrapper {
                                        case .one(let company):
                                            cell.textLabel?.text = company.name
                                        case .two(let member):
                                            cell.textLabel?.text = member.name.first
                                    }
                                    return cell
    })
}