如何向 UIBarButtonItem 添加自定义操作
how to add custom actions to UIBarButtonItem
我有一个嵌入到 NavigationCotroller 中的 viewController (HomeViewController()),我的 viewController 底部有一个带有 6 个单元格的水平 CollectionView,我已经实现了委托方法didSelectItemAt indexPath: IndexPath
现在,当我 select 任何单元格时,它将导航到相应的 viewController(self.navigationController?.pushViewController(ViewControllerInstance, animated: true)
) 让我们称它为 "NewVC1()",因为我正在使用 pushViewController,它会为我创建一个后退按钮,如果我点击后退按钮,它会弹回到上一个 viewController。这是一般情况并且按预期工作。
在我的例子中,在 select 在 "HomeViewController()" 中设置 collectionViewCell 后,我将进入 "NewVC1()" 并且在那里我拥有与之前相同的 CollectionView viewController(HomeViewController()) 现在,如果我再次 select 当前 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 (?)
您可以通过两种方式实现此目的:
第一种方法 - 创建自己的后退按钮:
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)
}
}
不要从 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)
}
我有一个嵌入到 NavigationCotroller 中的 viewController (HomeViewController()),我的 viewController 底部有一个带有 6 个单元格的水平 CollectionView,我已经实现了委托方法didSelectItemAt indexPath: IndexPath
现在,当我 select 任何单元格时,它将导航到相应的 viewController(self.navigationController?.pushViewController(ViewControllerInstance, animated: true)
) 让我们称它为 "NewVC1()",因为我正在使用 pushViewController,它会为我创建一个后退按钮,如果我点击后退按钮,它会弹回到上一个 viewController。这是一般情况并且按预期工作。
在我的例子中,在 select 在 "HomeViewController()" 中设置 collectionViewCell 后,我将进入 "NewVC1()" 并且在那里我拥有与之前相同的 CollectionView viewController(HomeViewController()) 现在,如果我再次 select 当前 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 (?)
您可以通过两种方式实现此目的:
第一种方法 - 创建自己的后退按钮:
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)
}
}
不要从 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)
}