更改 UIcollectionView 的 didSelect 上的 tableviewHeader

Posted

技术标签:

【中文标题】更改 UIcollectionView 的 didSelect 上的 tableviewHeader【英文标题】:Change tableviewHeader on didSelect of UIcollectionView 【发布时间】:2020-12-14 16:31:59 【问题描述】:

我有 2 个 ViewController,FirstViewControllerSecondViewController。 第一个包含UITableView,另一个包含UICollectionView,分别带有headerViews。

假设我有 2 个UITableView 标头,DefaultHeaderView 和 SelectedHeaderView,那么我要达到什么目的?

我想要实现的是,当SecondViewController didSelect 中的UICollectionView 被点击时,我希望FirstViewControllerUITableView 将其DefaultHeaderView 更改/替换为@987654332 @ . 但是,到目前为止我尝试过的方法似乎不起作用或根本不是正确的方法。

我已经在FirstViewController 中声明了这个变量以确定是否需要更改并重新加载tableView:

var isNewHeader = false 
        didSet 
            tableVIew.reloadData()
        

这是我的tableView viewForHeaderInSection 方法:


    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
        let defaultHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: DefaultHeaderView.identifier) as! DefaultHeaderView
        let selectedHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: SelectedHeaderView.identifier) as! SelectedHeaderView

        if (isNewHeader) 
            return selectedHeader
         else 
            // defaultHeader is set as the default value.
            return defaultHeader
        
        
    

创建后,在SecondViewControllerUICollectionViews didSelectItem 方法中,我尝试将isNewHeader 设置为true 并获取FirstViewController 以返回替换的headerView。

extension SecondViewController: UICollectionViewDelegate 
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        if let vc = storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController 
            //** Here, I am getting `nil` return value for tableView in `FirstViewController` 
                 which actually is obvious.
            vc.isNewHeader = true
            self.navigationController?.popViewController(animated: true)
        
    

有没有更好的方法?

【问题讨论】:

【参考方案1】:

instantiateViewController 使用指定的标识符创建视图控制器,并使用故事板中的数据对其进行初始化。您可以通过比较实例来简单地检查它

当您使用navigationController?.popViewController(animated: true) 时,我假设FirstViewControllernavigationController 的根

你可以使用if let vc = navigationController?.viewControllers.first as? FirstViewController之类的东西

【讨论】:

感谢您的回答,但是您的回答与问题上下文相去甚远...... 为什么会这样?你有first VC,里面有table,并通过推/呈现/随便呈现第二个。正如我在didSelect 方法中看到的,您正在尝试获取first VC 的实例并更新属性。但是您使用的 instantiateViewController 方法不正确。如果不只是将navigationController?.viewControllers.first as? FirstViewController 替换为whatever.viewControllers.first as? FirstViewController,我假设您两者都在导航堆栈中 它工作了..我也有我自己的错误配置,所以一开始它没有工作,但它工作.. .

以上是关于更改 UIcollectionView 的 didSelect 上的 tableviewHeader的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 更改布局 - 更改单元格

更改 UICollectionView 部分标题的高度

如何更改 UICollectionView 插座的高度?

如何更改 UICollectionView 中的滚动方向?

定期更改 UICollectionView 单元格图像

Swift UIcollectionView 在同一个 ViewController 上更改第二个 UICollectionView 的内容?