如何将新的 UICollectionViewController 推送到单元格单元格内的 navigationController
Posted
技术标签:
【中文标题】如何将新的 UICollectionViewController 推送到单元格单元格内的 navigationController【英文标题】:How to push a new UICollectionViewController to the navigationController inside a cell of cells of cells 【发布时间】:2019-01-05 23:59:08 【问题描述】:我以编程方式构建了一个 UICollectionViewController,它返回 4 个单元格。 HomeCell、TrendingCell、SubscriptionCell 和 AccountCell。 所有 4 个单元格都应该不同,您可以水平滚动它们。 。
class HomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout
override func viewDidLoad()
super.viewDidLoad()
collectionView?.register(HomeCell.self, forCellWithReuseIdentifier: homeCellId)
collectionView?.register(TrendingCell.self, forCellWithReuseIdentifier: trendingCellId)
collectionView?.register(SubscriptionCell.self, forCellWithReuseIdentifier: subscriptionCellId)
collectionView?.register(AccountCell.self, forCellWithReuseIdentifier: accountCellId)
让我们以 HomeController 的第一个单元格 HomeCell 来说明我的问题。 Homecell 具有三个自定义单元,分别称为 VideoCell、CategoryCell 和 UserSearchCell。
class HomeCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
let cellId = "cellId"
let searchId = "sarchId"
let scrollId = "scrollId"
lazy var collectionView: UICollectionView =
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.backgroundColor = UIColor.white
cv.dataSource = self
cv.delegate = self
return cv
()
override func setupViews()
super.setupViews()
.....
// register three different cells within HomeCell
collectionView.register(VideoCell.self, forCellWithReuseIdentifier: cellId)
collectionView.register(CategoryCell.self, forCellWithReuseIdentifier: scrollId)
collectionView.register(UserSearchCell.self, forCellWithReuseIdentifier: searchId) //
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
在 HomeCell 中,我将 UserSearchCell 注册为第三个单元格。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
if indexPath.item == 0
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoId", for: indexPath)
else if indexPath.item == 1
cell = collectionView.dequeueReusableCell(withReuseIdentifier: categoryId, for: indexPath)
else
cell = collectionView.dequeueReusableCell(withReuseIdentifier: searchId, for: indexPath)
return cell
如果我单击该元素,我的目标是将新的 ViewController 推送到 navigationController。但我无权访问,也不知道如何更改该嵌套结构中的视图。我尝试了 HomeCell 类中的 didSelectItem 方法,并在单击第三个单元格时能够在控制台打印一些内容,但无法更改视图。
class HomeCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if indexPath.item == 2
print(123)
....
请帮忙。有没有办法在 HomeCell 的 didSelectItem 方法中更改 View ??
【问题讨论】:
【参考方案1】:您需要编写一个协议来引用您的 HomeController。
protocol HomeCellProtocol
func pushNavigation(_ vc: UIViewController)
向 HomeCell 类添加写入委托属性
class HomeCell: .....
var delegate: HomeCellProtocol?
并让 HomeController 与 HomeCellProtocol 确认
extention HomeController: HomeCellProtocol
func pushNavigation(_ vc: UIViewController)
self.navigationController?.pushViewController(vc, animated: true)
当您设置 HomeCell 时,您需要在 HomeController 中设置您的委托
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
cell = collectionView.dequeueReusableCell(withReuseIdentifier: homeCellId, for: indexPath) as HomeCell;
cell.delegate = self // Set the delegate
return cell
最后,你可以在 HomeCell 中调用 push 函数
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if indexPath.item == 2
let vc = UIViewController();
self.delegate?.pushNavigation(vc);
【讨论】:
虽然 Mehmet 的方法有效,但我认为您的单元格中不应该有导航逻辑,您确实希望向 HomeController 传递足够的信息,以便它可以执行正确的业务逻辑(在这种情况下导航逻辑)。我会让我的代表说出发生了什么而不是做什么:委托方法看起来更像homeCellDidTapUserSearch()
。你甚至可以使用 swift 的真棒枚举,这样你就有了homeCellDidTap(.userSearch)
。稍后您甚至可以使用这些枚举来配置主单元格,这样您就不会每次都重新发明***。
感谢它成功了,我可以推送一个新的 ViewController。想象一下,我点击了 3 号单元格,而不是推送一个新的 ViewController,我想更改 2 号单元格的内容。这怎么可能?以上是关于如何将新的 UICollectionViewController 推送到单元格单元格内的 navigationController的主要内容,如果未能解决你的问题,请参考以下文章
postgresql 函数 - 如何将新的 json 对象推送到 json 数组?
如何将新的 FormGroup 或 FormControl 添加到表单
如何将新的 UICollectionViewController 推送到单元格单元格内的 navigationController
如何将新的 viewController 推送到另一个视图控制器中的现有视图中?