在容器视图中选择 collection 单元格时更改导航左栏按钮标题
Changing navigation Left Bar button title while selecting collection cell inside a container view
我在容器视图中有一个 collection 视图。在 collection 视图中,我有两个部分, UICollectionReusableView
和 UICollectionViewCell
。在 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)).
}
}
希望这能解决您的问题。
我在容器视图中有一个 collection 视图。在 collection 视图中,我有两个部分, UICollectionReusableView
和 UICollectionViewCell
。在 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)).
}
}
希望这能解决您的问题。