Xamarin 如何在iOS应用程序中的任何位置显示屏幕?
形势 一款内置Xamarin的iOS应用程序,有4个屏幕。启动应用程序时,它会尝试检索信息以填充第一个屏幕。如果用户令牌过期,则引发异常。AppDelegate侦听这些消息,收到后将显示登录屏幕:Xamarin 如何在iOS应用程序中的任何位置显示屏幕?,xamarin,xamarin.ios,Xamarin,Xamarin.ios,形势 一款内置Xamarin的iOS应用程序,有4个屏幕。启动应用程序时,它会尝试检索信息以填充第一个屏幕。如果用户令牌过期,则引发异常。AppDelegate侦听这些消息,收到后将显示登录屏幕: \u window.RootViewController.PresentViewController(\u loginViewController,true,null) (\u window是第一个屏幕。\u loginViewController是用户输入用户名和密码的屏幕。) 在第一个屏幕上,此功
\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上保留一个句柄,这样您就可以在用户登录后恢复以前的层次结构。