我正在使用 Facebook Auth SDK , 使用 Xamarin Forms C# example .然而,Facebook SDK 已经贬低了该方法并将其替换为将 fromViewController
变量添加到构造函数中的方法。我对 Xamarin 中的 ViewControllers 的概念不是特别满意,或者实际上对来自样本的这段代码不太满意,那么有没有办法衡量当前的 ViewController?
我看过一些 .net 示例,例如NSArray *viewContrlls=[[self navigationController] viewControllers];[viewContrlls lastObject];
但是,这种方法似乎不适用于 Xamarin,因为 self
不包含导航 Controller 的定义。
或者,是否有任何方法可以使用示例代码轻松计算出我当前的 ViewController 存储在哪个变量中?
最佳答案
更新 为了在竞争条件下支持较新的 iOS 版本,此方法变得有点复杂。这是该实用程序的新版本,有一些改进:
public static UIViewController? GetTopViewController()
{
var window = UIApplication.SharedApplication.GetKeyWindow();
var vc = window?.RootViewController;
while (vc is { PresentedViewController: { } })
vc = vc.PresentedViewController;
if (vc is UINavigationController { ViewControllers: { } } navController)
vc = navController.ViewControllers.Last();
return vc;
}
public static UIWindow? GetKeyWindow(this UIApplication application)
{
if (!UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
return application.KeyWindow; // deprecated in iOS 13
var window = application
.ConnectedScenes
.ToArray()
.OfType<UIWindowScene>()
.SelectMany(scene => scene.Windows)
.FirstOrDefault(window => window.IsKeyWindow);
return window;
}
旧答案
如果当前 View Controller 位于父 UINavigationController
的堆栈中,则接受的答案不会为您提供当前 View Controller ,因此我想出了以下内容:
public static UIViewController GetTopViewController()
{
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
vc = vc.PresentedViewController;
if (vc is UINavigationController navController)
vc = navController.ViewControllers.Last();
return vc;
}
关于c# - 如何在 Xamarin 中查找当前的 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582728/