繁体   English   中英

在同一视图 controller 中将数据从集合视图传递到表视图:

[英]pass data from collection view to table view in the same view controller:

如果我单击集合视图的特定单元格,则应在同一视图 controller 的表视图中显示与该集合视图单元格相关的数据(不在其他视图控制器中)

在 collectionView 的didSelectItemAt方法上,您重置 tableView 的数据源并重新加载应该完成工作的 tableView。

不管有一个或多个视图控制器。 一个好的做法是拥有一个适合您的可视化 state 的数据结构。 对于你的情况,我希望有类似的东西

var collectionViewItems: [Any]
var tableViewItems: [Any]

但更具体地说,让我们假设我们有一个用户集合视图,在按下某个用户后,表格视图应该更新该用户的朋友列表。

像下面这样的数据源可以表明:

struct User {
    let name: String
    let friends: [User]
}

现在要创建一个更适合您的显示的结构,您可以使用以下内容:

class UserFriendsDataModel {
    let allUsers: [User]
    var selectedUser: User?
    
    init(allUsers: [User]) { self.allUsers = allUsers }
}

在您的视图 controller 中,您将创建数据 model 的新实例。 可能在viewDidLoad中,但这一切都取决于您如何收集数据。

例如

class ViewController: UIViewController {

    private var dataModel: UserFriendsDataModel?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        dataModel = .init(allUsers: [
            .init(name: "Me", friends: [.init(name: "You", friends: [])])
        ])
    }


}

现在您的数据源实现可以将dataModel?.allUsers用于集合视图,将dataModel?.selectedUser?.friends用于您的表视图。

extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        dataModel?.selectedUser?.friends.count ?? 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = dataModel?.selectedUser?.friends[indexPath.row].name
        return cell
    }
    
}

现在剩下的就是交互。 当按下集合视图单元格时,您会这样做

extension ViewController: UICollectionViewDelegate {
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let user = dataModel?.allUsers[indexPath.row]
        dataModel?.selectedUser = user
        tableView?.reloadData()
    }
    
}

请注意,正在使用selectedUser = user选择新用户,然后为调用tableView?.reloadData()的表视图触发重新加载,这将强制表视图调用数据源方法并获取新信息。

更好的方法可能是通过在数据 model 上创建自己的委托来监听所选用户的变化并做出响应。 但是对于这个问题,这已经超出了 scope 的范围。

我希望这能让你走上正确的道路。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM