拦截ios后退按钮发送回基本视图控制器

时间:2017-10-03 21:22:05

标签: ios swift xamarin xamarin.ios

我们有一系列按顺序导航的屏幕......

BaseViewController - > A - > B - > BaseViewController

每个屏幕使用NavigationController.PushViewController来自...... Base-> A,A-> B.因此,每个后续屏幕都放在导航堆栈中。

因此,如果您在A上并点击“返回”,则会返回到一个屏幕。这很好用,因为它由NavigationController控制。

enter image description here

但是,当您在屏幕B上时,'返回'应该回到BaseViewController。

相反,它(由Apple设计)回到A.有没有办法拦截'后退' B上的按钮,所以我们可以使用NavigationController.PopToViewController将用户发送回BaseViewController?

5 个答案:

答案 0 :(得分:1)

你可以在B&#39 viewDidAppear函数中执行类似的操作:

guard let navigationController = self.navigationController else {
    return
}
navigationController.viewControllers.remove(at: navigationController.viewControllers.count - 2)

这将从堆栈中删除A,并允许您从B返回BaseViewController。

答案 1 :(得分:1)

  1. 正如@ the4kman所提到的,我们可以创建一个自定义按钮来替换LeftBarButtonItem,并处理back事件。
  2. B 中的

    ViewDidLoad
    this.NavigationItem.LeftBarButtonItem = 
        new UIBarButtonItem("back", UIBarButtonItemStyle.Plain, (sender,e) => {
            UIViewController baseVC = NavigationController.ViewControllers[NavigationController.ViewControllers.Length - 3];
            NavigationController.PopToViewController(baseVC, true);
    });
    
    1. As @ J.C. Chaparro提到,从堆栈中删除A.
    2. B

    中的

    ViewDidLoad
    List<UIViewController> list = NavigationController.ViewControllers.ToList<UIViewController>();
    list.RemoveAt(list.Count-2);
    NavigationController.ViewControllers = list.ToArray();
    

答案 2 :(得分:1)

如果我理解正确,您希望从某个顶视图控制器弹出到根视图控制器。一种方法是创建UINavigationController的子类并覆盖popViewController方法,在此方法中,您可以检查当前最重要的内容并决定是否弹出到root。这是一个例子:

open class CustomNavigationController: UINavigationController {
    override open func popViewController(animated: Bool) -> UIViewController? {
        if topViewController is BViewController {
            return popToRootViewController(animated: animated)?.last
        } else {
            return super.popViewController(animated: animated)
        }
    }
}

答案 3 :(得分:0)

的方法:

  • 使用子视图控制器

步骤:

  1. 创建一个视图控制器C,它是Base
  2. 的子类
  3. A作为子视图控制器添加到C
  4. 创建一个视图控制器D,它是Base
  5. 的子类
  6. B作为子视图控制器添加到D
  7. C推送至D

答案 4 :(得分:0)

感谢所有答案。 @Cole Xia让我走上正确的道路。他的技术有效,以下也有效。

这是Xamarin代码。该技术是用新的ViewControllers替换当前的ViewControllers列表。然后当&#39;回来&#39;在B上命中,它会回到BaseViewController。

var viewControllers = new UIViewController[] { NavigationController.ViewControllers[0], new B() };
NavigationController.SetViewControllers(viewControllers, false);