[英]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.