【问题标题】:How to find current UIViewController in Xamarin如何在 Xamarin 中找到当前的 UIViewController
【发布时间】:2016-04-07 13:38:41
【问题描述】:

我正在使用 Facebook Auth SDK,带有 Xamarin Forms C# example。但是,Facebook SDK 已经贬低了该方法,并将其替换为在构造函数中添加fromViewController 变量的方法。我对 Xamarin 中的 ViewControllers 的概念并不特别满意,或者确实对来自示例的这段代码不太满意,那么有没有办法衡量当前的 ViewController?

我看过一些 .net 示例,例如NSArray *viewContrlls=[[self navigationController] viewControllers];[viewContrlls lastObject]; 但是,这种方法似乎不适用于 Xamarin,因为 self 不包含导航控制器的定义。

或者,是否有任何方法可以使用示例代码轻松计算出我当前的 ViewController 存储在哪个变量中?

【问题讨论】:

    标签: c# .net facebook xamarin xamarin.ios


    【解决方案1】:

    更新 为了在竞争条件下支持较新的 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;
    }
    

    旧答案

    如果当前视图控制器位于父级 UINavigationController 的堆栈中,则接受的答案不会为您提供当前视图控制器,因此我想出了以下内容:

    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;
    }
    

    【讨论】:

    • 赞成,谢谢,这正是我想要的。为我节省了很多时间。
    • 没有这样的方法:navController.ViewControllers.Last()
    • @Tertium 你需要加using System.Linq;
    【解决方案2】:

    最好的方法是传入对调用 Auth 方法的 ViewController 的引用。

    不过,您也可以尝试这种方法(由 Xamarin Forums 上的 AdamKemp 提供)

    var window= UIApplication.SharedApplication.KeyWindow;
    var vc = window.RootViewController;
    while (vc.PresentedViewController != null)
    {
        vc = vc.PresentedViewController;
    }
    

    【讨论】:

    • 谢谢 - 我现在就试试这个!这是让我感到困惑的一点。在示例中,您会看到只有一个按钮的LoginPage(),但 Facebook 按钮是一个空类,它在 ios 项目中在 FacebookButtonRenderer.cs 中有一些定义,在我的 Facebook 登录屏幕弹出期间哪个 ViewController 处于活动状态.
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2017-04-25
    相关资源
    最近更新 更多