首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同对象的UITableViewDiffableDataSource和NSDiffableDataSourceSnapshot只显示一行

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

Stack Overflow用户
提问于 2020-07-19 07:04:27
回答 1查看 513关注 0票数 0

我使用UITableView实现了UITableViewDiffableDataSourceNSDiffableDataSourceSnapshot,如

代码语言:javascript
复制
    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段更改,更新包装类型各自的数据。但问题是每次只显示一条记录。

代码语言:javascript
复制
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))
    }
}

非常感谢你的帮助,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-19 07:44:14

您每节只应用一项,必须声明包装器。

代码语言:javascript
复制
enum Wrapper: Hashable {
    case one(Company)
    case two(Member)
}

handleSegmentChanged中,创建一个Wrapper项的数组,而不是一个带有关联类型数组的Wrapper

代码语言:javascript
复制
@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($0)})
    }
}

并将updateData替换为

代码语言:javascript
复制
func updateData(_ wrapper: [Wrapper]) {
    var snapshot = ListSnapshot()
    snapshot.appendSections([.main])
    snapshot.appendItems(wrapper)
    dataSource.apply(snapshot, animatingDifferences: true)
}

[weak self] -> selfconfigureDataSource的舞蹈是无稽之谈。闭包的第一个参数是表视图。使用此实例可避免出现任何self,并将configureDataSource替换为

代码语言:javascript
复制
 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
    })
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62977274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档