我们有一系列按顺序导航的屏幕......
BaseViewController - > A - > B - > BaseViewController
每个屏幕使用NavigationController.PushViewController
来自...... Base-> A,A-> B.因此,每个后续屏幕都放在导航堆栈中。
因此,如果您在A上并点击“返回”,则会返回到一个屏幕。这很好用,因为它由NavigationController控制。
但是,当您在屏幕B上时,'返回'应该回到BaseViewController。
相反,它(由Apple设计)回到A.有没有办法拦截'后退' B上的按钮,所以我们可以使用NavigationController.PopToViewController将用户发送回BaseViewController?答案 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)
LeftBarButtonItem
,并处理back
事件。ViewDidLoad
this.NavigationItem.LeftBarButtonItem =
new UIBarButtonItem("back", UIBarButtonItemStyle.Plain, (sender,e) => {
UIViewController baseVC = NavigationController.ViewControllers[NavigationController.ViewControllers.Length - 3];
NavigationController.PopToViewController(baseVC, true);
});
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)
C
,它是Base
A
作为子视图控制器添加到C
D
,它是Base
B
作为子视图控制器添加到D
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);