如果我單擊集合視圖的特定單元格,則應在同一視圖控制器(而不是其他視圖控制器)中的表視圖中顯示與該集合視圖單元格相關的資料
uj5u.com熱心網友回復:
在didSelectItemAtcollectionView 方法上,您重置 tableView 的資料源并重新加載應該完成這項作業的 tableView。
uj5u.com熱心網友回復:
不管有一個或多個視圖控制器。一個好的做法是擁有適合您的視覺狀態的資料結構。對于你的情況,我希望有類似的東西
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 }
}
在您的視圖控制器中,您將創建資料模型的新實體。可能在,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()這將強制表視圖呼叫資料源方法并獲取新資訊。
更好的方法可能是通過在您的資料模型上創建您自己的委托來監聽所選用戶的變化并做出回應。但這已經超出了這個問題的范圍。
我希望這能讓你走上正確的道路。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394791.html
