c# - 如何在 Xamarin 中查找当前的 UIViewController

标签 c# .net facebook xamarin xamarin.ios

我正在使用 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/

相关文章:

c# - TRY-CATCH 相对于 USING

c# - Parallel.ForEach 花费的时间比预期的多

.net - 对象在执行期间被垃圾收集?

mysql - 将facebook数据存储到mysql

c# - XNA 中是否有 3D 等效项?

c# - 3 层应用程序架构中的域层是否应该包装 UI 层所需的数据层类?

c# - 在高质量图像上设置水印

c# - Int32既然是值类型,为什么要继承.ToString()呢?

facebook - 申请网站

facebook - 在网站 "Recommend This Site"按钮点击和 "Share This Story"按钮点击上获得不一致的 Facebook 点赞计数器