在容器视图内选择收集单元时更改导航左栏按钮标题

时间:2019-06-10 09:57:56

标签: ios swift uinavigationbar uicontainerview

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

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

我使用了上面的代码,但它没有更改navigationButton。

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

3 个答案:

答案 0 :(得分:3)

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

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

prepare(for segue:, sender:)中实施HomeFilterVCDelegateHomeVC方法,并按如下所示更新代码。

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

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

答案 1 :(得分:1)

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

    postgresql@9.5-main.service - PostgreSQL Cluster 9.5-main
   Loaded: loaded (/lib/systemd/system/postgresql@.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since lun. 2019-06-10 12:04:22 CET; 1h 59min ago
  Process: 2951 ExecStart=postgresql@%i --skip-systemctl-redirect %i start (code=exited, status=1/FAILURE)

juin 10 12:04:22 server-inprotec systemd[1]: Starting PostgreSQL Cluster 9.5-main...
juin 10 12:04:22 server-inprotec postgresql@9.5-main[2951]: Error: Config owner (inprotec:1000) and data owner (postgres:111) do not 
juin 10 12:04:22 server-inprotec systemd[1]: postgresql@9.5-main.service: Control process exited, code=exited status=1
juin 10 12:04:22 server-inprotec systemd[1]: Failed to start PostgreSQL Cluster 9.5-main.
juin 10 12:04:22 server-inprotec systemd[1]: postgresql@9.5-main.service: Unit entered failed state.
juin 10 12:04:22 server-inprotec systemd[1]: postgresql@9.5-main.service: Failed with result 'exit-code'.

如果您知道那里已经有一个按钮,只是想更改标题,请使用下面的功能。

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

希望这将有助于更改条形按钮的标题!

答案 2 :(得分:1)

首先,在您的property中为leftItem创建一个ViewController,将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
    }
}

在上面的代码中,我最初在leftBarButtonItem中添加了viewWillAppear(_:)。由于我们将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)"
}