【问题标题】:how to add custom actions to UIBarButtonItem如何向 UIBarButtonItem 添加自定义操作
【发布时间】:2018-05-30 11:46:48
【问题描述】:

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

现在,当我选择任何一个单元格时,它将导航到相应的 viewController(self.navigationController?.pushViewController(ViewControllerInstance, animated: true)) 让我们称之为“NewVC1()”,因为我正在使用 pushViewController,它会为我创建一个后退按钮,如果我点击在后退按钮上,它将弹回前一个 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 (?)

【问题讨论】:

  • 为什么是downvote..?

标签: ios uinavigationbar swift4 backbarbuttonitem


【解决方案1】:

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

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

【讨论】:

  • 谢谢你的回复兄弟,但我正在推动collectionView。在 HomeViewController 中,我有 6 个项目的 collectionView,每个项目导航到不同的 viewController,每个单独的 viewController 都有相同的 collectionView,就像在 HomeViewController 中一样,我可以再次导航到任何 ViewController,但是当我按下“返回”按钮时,它应该会出现主视图控制器。我是新学编程,对setViewControllers一无所知,也不知道在哪里使用你建议的代码。
  • 我理解你的问题。您可以使用此答案解决您的问题。
  • 但是,我应该在哪里使用您建议的代码?什么是 newVC?
【解决方案2】:

您可以通过两种方式实现:

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

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

}

【讨论】:

  • 感谢您的快速响应,我尝试了两种方法,但仍然无法得到我想要的。它像以前一样正常工作。为了清楚起见,我编辑了问题,请查看已编辑的部分..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多