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

时间:2016-04-19 17:45:12

标签: xamarin xamarin.ios

场合

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

_window.RootViewController.PresentViewController(_loginViewController, true, null);

_window是第一个屏幕。_loginViewController是用户输入用户名和密码的屏幕。)

在第一个屏幕上可以正常工作。但我需要一种方法来从任何屏幕显示_loginViewController

问题/问题

  • 从AppDelegate,有没有办法知道当前屏幕是什么屏幕?
  • 我应该采用不同的方式构建我的项目,以便能够显示登录屏幕,无论我在应用程序中的哪个位置?
  • 此方案是否有常见做法?

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以通过在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;

这是this answer的C#端口。

要从app中的任何位置呈现视图控制器,请使用上面的代码:

MFMailComposeViewController mailController = new MFMailComposeViewController();

// ...

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

答案 2 :(得分:0)

您可以在AppDelegate中创建一个方法,如下所示:

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

然后从任何ViewController中调用它,如下所示:

var appDelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
appDelegate.ShowLoginView ();

使用以下命令在LoginViewController中将其关闭:

DismissModalViewController (true);

如果您使用导航堆栈,这将允许您保留导航堆栈。