无法在 Xamarin iOS 中获取 RootViewController

Posted

技术标签:

【中文标题】无法在 Xamarin iOS 中获取 RootViewController【英文标题】:Unable to get RootViewController in Xamarin iOS 【发布时间】: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”。 【参考方案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; 
        
    

【讨论】:

以上是关于无法在 Xamarin iOS 中获取 RootViewController的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin-ios Widgets无法加载

Xamarin-iOS今日小部件,无法加载问题

Xamarin.iOS:无法在 UIScrollView 中调用 TouchEvent

Xamarin.iOS 无法在推送通知中显示照片

在 iOS 上的 Xamarin.Forms.Maps 中使用 Xamarin.Essentials Geolocation 获取设备位置的奇怪问题

如何使用 Xamarin 在 iOS 13 中获取设备令牌?