在容器视图中选择 collection 单元格时更改导航左栏按钮标题

Changing navigation Left Bar button title while selecting collection cell inside a container view

我在容器视图中有一个 collection 视图。在 collection 视图中,我有两个部分, UICollectionReusableViewUICollectionViewCell 。在 UICollectionReusableView 中,我再次有一个 collection 视图,从该单元格中选择一个单元格时,我必须更改 LeftNavigationBarTitle。我在 collection 视图的 didSelectItem 中尝试了以下代码,但没有任何反应。

navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "cancel-music")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(self.closeViewTapped)).

我使用了上面的代码,但它并没有改变导航按钮。

这是我的故事板设计。
我的代码有什么错误吗,请帮助我得到准确的代码。谢谢。

您可以像下面这样更改按钮标题:

func changeBarButtonTitle() {
    let leftitem = self.navigationItem.leftBarButtonItem!
    let leftbutton = leftitem.customView as! UIButton
    leftbutton.setTitle("<YOUR-TITLE>", for: .normal)
}

此外,如果您知道按钮已经存在并且只想更改标题,请使用下面的函数。

func changeBarButtonTitle() {

        if let leftitem = self.navigationItem.leftBarButtonItem {
            print("Left Button")
            leftitem.title = "test-left"
        }

        if let rightitem = self.navigationItem.rightBarButtonItem {
            print("Right Button")
            rightitem.title = "test-right"
        }
    }

希望这有助于更改栏按钮标题!

首先,在您的 ViewController 中为 leftItem 创建一个 property,这会将 reference 保存到 leftBarButtonItem,即

class VC: UIViewController, UICollectionViewDelegate {
    lazy var leftItem: UIBarButtonItem = {
        let item = UIBarButtonItem(image: UIImage(named: "Initial Title")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(closeViewTapped))
        return item
    }()

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationItem.leftBarButtonItem = self.leftItem
    }
}

在上面的代码中,我最初在 viewWillAppear(_:) 中添加了 leftBarButtonItem。由于我们将 reference 保存到 leftItem 中的 leftBarButtonItem,我们可以使用 leftItem.

对其进行任何更改

然后在您的 collectionView(_:didSelectItemAt:) 中使用相同的 property 来更改您的 leftBarButtonItem's title,即

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.leftItem.title = "Title at Index - \(indexPath.row)"
}

为包含集合视图的视图控制器创建协议方法。

里面HomeFilterVC

protocol HomeFilterVCDelegate: class {
    func collectionViewDidTapped()
}

然后,如下声明委托变量,它将分配给包含 UIContainerView.

的视图控制器
class HomeFilterVC: UIViewController {

    weak var delegate                   : HomeFilterVCDelegate?

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if let selfDelegate = self.delegate {
            selfDelegate.collectionViewDidTapped()
        }
    }
}

HomeVC 中实现 prepare(for segue:, sender:)HomeFilterVCDelegate 方法并更新您的代码如下。

首页VC:

class HomeVC: UIViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "HomeFilterVC" {

            let collectionVC = segue.destination as! HomeFilterVC
            collectionVC.delegate = self
        }
    }
}

extension HomeVC: HomeFilterVCDelegate {

    func collectionViewDidTapped() {
        navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "cancel-music")?.withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(self.closeViewTapped)).
    }
} 

希望这能解决您的问题。