memyselfandi, есть много разных понятий для понимания, и вы можете установить точку останова, чтобы увидеть структуру вашего rootViewController. Чтобы получить RootViewController в любом месте вашего приложения, вы можете сделать это:
var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
var rootVC = appDelegate.Window.RootViewController;
Существует два способа добавления ViewController, если ваш RootViewController не имеет UINavigationController:
- Вы можете показать ваш UIViewController только через PresentViewController изнутри этого RootViewController, поэтому он выглядит как модальный, а другое представление можно увидеть в фоновом режиме. Это, как вы уже знаете, просто делается так:
PresentViewController(vc, true, null);
Или вы можете заменить этот RootViewController на UINavigationController, который содержит ваш новый UIViewController. А затем просто продолжайте помещать вещи в стек NavigationController. Это не позволит другим представлениям оставаться в фоновом режиме.
var navController = new UINavigationController(vc);
// where, vc is the ViewController you want to replace the existing one with.
// Eg: think of situations where you login a user.
rootVC = navController;
Бонус: становится немного сложнее, когда у вас viewControllers поверх других viewControllers сложены странным образом,так что вы можете передать свой viewController через что-то вроде этого:
public static void Push(UIViewController vc)
{
// to get the RootViewController, we have to get it from the AppDelegate
var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
var rootVC = appDelegate.Window.RootViewController;
// If you want to push to a ModalViewController which consists of a NavigationController
if (rootVC.PresentedViewController != null && rootVC.PresentedViewController.NavigationController != null)
rootVC.PresentedViewController.NavigationController.PushViewController(vc, true);
// If there already is a NavigationController, you can do a simple push
else if (rootVC.NavigationController != null)
rootVC.NavigationController.PushViewController(vc, true);
// If the NavigationController exists in a TabBar, we have to push on that
else if (rootVC != null
&& rootVC is UITabBarController tabbarController
&& tabbarController.SelectedViewController is UINavigationController navigationController)
navigationController.PushViewController(vc, true);
// If all else fails, present the ViewController as a modal
else if (rootVC != null)
rootVC.PresentViewController(vc, true, null);
}