Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin 如何在iOS应用程序中的任何位置显示屏幕?_Xamarin_Xamarin.ios - Fatal编程技术网

Xamarin 如何在iOS应用程序中的任何位置显示屏幕?

Xamarin 如何在iOS应用程序中的任何位置显示屏幕?,xamarin,xamarin.ios,Xamarin,Xamarin.ios,形势 一款内置Xamarin的iOS应用程序,有4个屏幕。启动应用程序时,它会尝试检索信息以填充第一个屏幕。如果用户令牌过期,则引发异常。AppDelegate侦听这些消息,收到后将显示登录屏幕: \u window.RootViewController.PresentViewController(\u loginViewController,true,null) (\u window是第一个屏幕。\u loginViewController是用户输入用户名和密码的屏幕。) 在第一个屏幕上,此功

形势

一款内置Xamarin的iOS应用程序,有4个屏幕。启动应用程序时,它会尝试检索信息以填充第一个屏幕。如果用户令牌过期,则引发异常。AppDelegate侦听这些消息,收到后将显示登录屏幕:

\u window.RootViewController.PresentViewController(\u loginViewController,true,null)

\u window
是第一个屏幕。
\u loginViewController
是用户输入用户名和密码的屏幕。)

在第一个屏幕上,此功能正常。但是我需要一种从任何屏幕显示
\u loginViewController
的方法

问题/问题

  • 从AppDelegate,是否有办法知道当前屏幕是哪个屏幕
  • 是否有一种不同的方式,我应该构建我的项目,以便无论我在应用程序中的何处都能显示登录屏幕
  • 此场景是否有常见的实践

注意:我的项目在Xamarin中,支持iOS 8+,但我确信如果我有一个Swift解决方案,我也可以使用它。

无论当前窗口如何,您都可以使用以下代码从AppDelegate显示登录屏幕:

var loginViewController = UIStoryboard.FromName("MainStoryboard", NSBundle.MainBundle).InstantiateViewController("LoginPageViewController") as LoginPageViewController;
Window.RootViewController = loginViewController;

您可以在AppDelegate中创建如下方法:

public void ShowLoginView()
{
    _window.RootViewController.PresentViewController(_loginViewController,true,null);
}
MFMailComposeViewController mailController = new MFMailComposeViewController();

// ...

AppDelegate.TopViewController.PresentViewController(mailController, true, null);
然后从任何ViewController调用它,如下所示:

var appDelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
appDelegate.ShowLoginView ();
并在LoginViewController中使用以下命令将其关闭:

DismissModalViewController (true);

这将允许您在使用导航堆栈时保留导航堆栈。

您可以通过在
AppDelegate上定义为静态属性的以下代码找到最顶层的视图控制器:

[Register("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{

    public static UIViewController TopViewController
    {
        get
        {
            return TopViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController);
        }
    }

    public static UIViewController TopViewControllerWithRootViewController(UIViewController rootViewController)
    {
        if (rootViewController is UITabBarController)
        {
            var tabBarController = rootViewController as UITabBarController;
            return TopViewControllerWithRootViewController(tabBarController.SelectedViewController);

        }
        if (rootViewController is UINavigationController)
        {
            var navBarController = rootViewController as UINavigationController;
            return TopViewControllerWithRootViewController(navBarController.VisibleViewController);
        }

        var presentedViewController = rootViewController.PresentedViewController;

        if (presentedViewController != null)
        {
            return TopViewControllerWithRootViewController(presentedViewController);
        }

        return rootViewController;
这是一个港口

要从应用程序中的任何位置显示视图控制器,请使用以下代码:

public void ShowLoginView()
{
    _window.RootViewController.PresentViewController(_loginViewController,true,null);
}
MFMailComposeViewController mailController = new MFMailComposeViewController();

// ...

AppDelegate.TopViewController.PresentViewController(mailController, true, null);

这主意不错,我想补充一点,您可以在原始的RootViewController上保留一个句柄,这样您就可以在用户登录后恢复以前的层次结构。