【问题标题】:Changing navigation Left Bar button title while selecting collection cell inside a container view在容器视图中选择集合单元格时更改导航左栏按钮标题
【发布时间】:2019-10-24 17:19:07
【问题描述】:

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

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

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

这是我的故事板设计。
我的代码中是否有任何错误,请帮助我得到确切的错误。谢谢。

【问题讨论】:

  • 导航栏标题或左栏按钮标题要改什么?
  • 左栏按钮标题
  • 包含集合视图的UIViewController 的名称是什么?
  • @MayurKarmur HomeFilterVC
  • @AngelFSyrus,检查我的答案。

标签: ios swift uinavigationbar uicontainerview


【解决方案1】:

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

内部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 方法并按如下方式更新您的代码。

HomeVC:

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)).
    }
} 

我希望这能解决您的问题。

【讨论】:

  • 在 HomeFilterVC 中将错误显示为 Use of unresolved identifier 'selfDelegate 而且我这里没有使用 segue。
  • 对不起,这是拼写错误,请使用if let selfDelegate = self.delegate { }
  • 在 HomeVC 的扩展中显示 使用未声明的类型 'CollectionVCDelegate' 以及如何将委托连接到 HomeFilterVC
  • 实际上,您使用的是嵌入视图控制器的容器视图,因此在此处设置 HomeFilterVC 标识符,以便您解决问题。
  • @AngelFSyrus,很高兴为您提供帮助。
【解决方案2】:

首先,在您的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 保存到leftBarButtonItem 中的leftItem,因此我们可以使用leftItem 对其进行任何更改。

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

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

【讨论】:

    【解决方案3】:

    您可以更改按钮标题,如下所示:

    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"
            }
        }
    

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

    【讨论】:

    • 你的应用是导航基础应用还是单视图控制器应用?
    • 导航基础应用
    • 你的导航栏中已经有leftbarbutton了吧?并且只想更新该栏按钮的标题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多