【问题标题】:Unable to get RootViewController in Xamarin iOS无法在 Xamarin iOS 中获取 RootViewController
【发布时间】:2017-08-03 06:31:55
【问题描述】:

我创建了使用 Azure AD 进行身份验证的应用

在 Android 中它工作正常,但在 iOS 中,它需要 RootViewController 来加载页面。但是UIApplication.SharedApplication.KeyWindow 为空。所以我无法获得UIApplication.SharedApplication.KeyWindow.RootViewController

下面是代码:

var authResult = await authContext.AcquireTokenAsync(
    graphResourceUri, 
    ApplicationID, 
    new Uri(returnUri), 
    new PlatformParameters(UIApplication.SharedApplication.KeyWindow.RootViewController)
);

我可以通过任何其他方式获得RootViewController

【问题讨论】:

  • 您能否显示您在应用程序中的哪个位置调用了 await authContext.AcquireTokenAsync?也许您要提早了?
  • 试试这个:UIApplication.SharedApplication.Delegate.GetWindow().RootViewController;
  • @ColeXia 如果过早调用它不会改变任何东西。
  • 是的,如果在窗口生成之前调用这个“AcquireTokenAsync”函数,rootViewcontroller的返回肯定是null。
  • 除非您的视图确实出现,否则您的 KeyWindow 为“null”。所以覆盖“ViewDidAppear()”,你可以访问“KeyWindow”,当然还有它的“RootViewController”。

标签: xamarin xamarin.ios xamarin.forms


【解决方案1】:

这看起来很愚蠢,但很有效。

        UIWindow window = UIApplication.SharedApplication.KeyWindow;
        UIViewController presentedVC = window.RootViewController;
        while (presentedVC.PresentedViewController != null)
        {
            presentedVC = presentedVC.PresentedViewController;
        }

【讨论】:

    【解决方案2】:

    我也试过这段代码,但它不起作用。

    我找到了这个问题的根本原因。问题是,当我要访问 RootViewController 时,应该至少有一个页面已初始化,但它没有初始化,所以我无法获取 RootViewController

    所以我每天都初始化页面然后我得到了 RootViewController

    【讨论】:

      【解决方案3】:

      在实际创建窗口后访问RootViewController。 在base.FinishedLauching 之后执行此操作,如下所示:

      var result = base.FinishedLaunching(app, options);
      var platformParameters = UIApplication.SharedApplication.KeyWindow.RootViewController;
      App.AuthenticationClient.PlatformParameters = new PlatformParameters(platformParameters);
      return result;
      

      【讨论】:

        【解决方案4】:

        根据您加载的窗口类型,获取 RootViewController 可能会出现问题。这个版本是我迄今为止尝试过的最稳定的版本,并且避免了尾递归循环。

            public UIViewController GetRootController(){
                var root = UIApplication.SharedApplication.KeyWindow.RootViewController;
                while (true)
                {
                    switch (root)
                    {
                        case UINavigationController navigationController:
                            root = navigationController.VisibleViewController;
                            continue;
                        case UITabBarController uiTabBarController:
                            root = uiTabBarController.SelectedViewController;
                            continue;
                    }
        
                    if (root.PresentedViewController == null) return root;
                    root = root.PresentedViewController; 
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 1970-01-01
          • 2017-03-21
          • 2020-07-09
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多