场合
一款内置于Xamarin的iOS应用,拥有4个屏幕。当您启动应用程序时,它会尝试检索信息以填充第一个屏幕。如果用户令牌过期,则抛出异常。 AppDelegate 会侦听这些消息,收到后会显示登录屏幕:
_window.RootViewController.PresentViewController(_loginViewController, true, null);
(_window
是第一个屏幕。_loginViewController
是用户输入用户名和密码的屏幕。)
在第一个屏幕上可以正常工作。但我需要一种方法来从任何屏幕显示_loginViewController
。
问题/问题
注意:我的项目是在Xamarin并支持iOS 8+,但我确定如果我有一个Swift解决方案,我也可以使用它。
答案 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);
如果您使用导航堆栈,这将允许您保留导航堆栈。