无法在 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:无法在 UIScrollView 中调用 TouchEvent
在 iOS 上的 Xamarin.Forms.Maps 中使用 Xamarin.Essentials Geolocation 获取设备位置的奇怪问题