【问题标题】:Change tableviewHeader on didSelect of UIcollectionView更改 UIcollectionView 的 didSelect 上的 tableviewHeader
【发布时间】: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)
        }
    }
}

有没有更好的方法?

【问题讨论】:

    标签: ios swift uitableview uicollectionview


    【解决方案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,我假设您两者都在导航堆栈中
    • 它工作了..我也有我自己的错误配置,所以一开始它没有工作,但它工作.. .
    猜你喜欢
    • 2013-06-13
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多