如何向UIBarButtonItem添加自定义操作

时间:2018-05-30 11:46:48

标签: ios uinavigationbar swift4 backbarbuttonitem

我有一个嵌入到NavigationCotroller中的viewController(HomeViewController()),我在viewController底部有一个带有6个单元格的水平CollectionView,我实现了委托方法didSelectItemAt indexPath: IndexPath

现在,当我选择任何一个单元格时,它将导航到相应的viewController(self.navigationController?.pushViewController(ViewControllerInstance, animated: true)),当我使用pushViewController时,我将其称为“NewVC1()”,它将为我创建一个后退按钮,如果我单击后退按钮,它将弹回到上一个viewController。这是一般情况,并按预期工作。

在我的情况下,在“HomeViewController()”中选择了collectionViewCell后,我将转到“NewVC1()”,并且在那里我有与之前的viewController(HomeViewController())相同的CollectionView,现在如果我选择当前viewController(NewVC1())中的任何单元格我将导航到相应的viewController(NewVC2()),就像使用pushViewController之前一样,现在,如果我点击“NewVC2()”中的后退按钮,我不想去“NewVC1()”,而不是我想去“HomeViewController()”..我怎么能实现这一点,有没有可能做到这一点?

我希望你理解我想传达的内容,如果你不能理解我的不良英语,我很抱歉,也很抱歉,因为我觉得这个问题看起来很混乱......

修改

符号表示:

let VC1 = HomeViewController() let VC2 = NewViewController1() let VC3 = NewViewController2()

导航:VC1 - > VC2 - > VC3如果想回到VC1,

一般情况:

VC3 - > VC2和VC2 - > VC1(可能)

我的情况:

VC3 - > VC1(?)

2 个答案:

答案 0 :(得分:1)

而不是从VC2推送到VC3使用setViewControllers。然后,当您从VC3按下后退按钮时,它将返回VC1

VC2 collectionView didSelectItemAt

中使用此代码
let vc3 = self.storyboard?.instantiateViewController(withIdentifier: "VC3") as? VC3
if var viewControllers = self.navigationController?.viewControllers {
    viewControllers.removeLast()
    viewControllers.append(vc3)
    self.navigationController?.setViewControllers(viewControllers, animated: true)
}

enter image description here

答案 1 :(得分:0)

您可以通过两种方式实现这一目标:

第一种方式 - 创建自己的后退按钮:

let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = backButton  

func back(sender: UIBarButtonItem) {
    self.navigationController?.popToRootViewController(animated: true)
}  

第二种方式 - 使用isMovingFromParentViewController:

override func viewWillDisappear(animated : Bool) {
super.viewWillDisappear(animated)

if self.isMovingFromParentViewController {
    self.navigationController?.popToRootViewController(animated: true)
}

}