Как подключить несколько UIViewControllers без StoryBoard (чистый код)? Родной Xamarin.iOS - PullRequest
1 голос
/ 09 октября 2019

У меня есть несколько контроллеров UIViewController, но я не могу подключить их через кнопки. Один из них должен быть UINavigationController, потому что мне нужна кнопка «назад». Не проще ли для этого представления быть UIViewController и я добавляю кнопку вручную, чтобы «вернуться»?

Я не использую storyboard/swift/objective-c, это xamarin.ios native

1 Ответ

1 голос
/ 10 октября 2019

memyselfandi, есть много разных понятий для понимания, и вы можете установить точку останова, чтобы увидеть структуру вашего rootViewController. Чтобы получить RootViewController в любом месте вашего приложения, вы можете сделать это:

var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
var rootVC = appDelegate.Window.RootViewController;

Существует два способа добавления ViewController, если ваш RootViewController не имеет UINavigationController:

  1. Вы можете показать ваш 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...