在Xamarin.iOS中设置RootViewController后,NavigationController为null
本文关键字:NavigationController null RootViewController Xamarin iOS 设置 | 更新日期: 2023-09-27 18:28:23
我在Xamarin.iOS中使用故事板。DashboardViewController(一个UINavigationController)被设置为故事板中的初始视图。但是,在我的AppDelegate类中,FinishedLaunching方法有条件地检查用户在应用程序启动时是否需要登录。如果是这样,它将把"ViewController"(登录控制器)设置为RootViewController,否则它将实例化故事板设置的初始视图控制器,即"DashboardViewController"。这是FinishedLaunching方法的代码。
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// Override point for customization after application launch.
// If not required for your application you can safely delete this method
Window = new UIWindow(UIScreen.MainScreen.Bounds);
var storyboard = UIStoryboard.FromName("Main", NSBundle.MainBundle);
bool isLoggedOut = true;
UIViewController rootViewController;
if (isLoggedOut)
rootViewController = (UIViewController)storyboard.InstantiateViewController("ViewController");
else
rootViewController = (UIViewController)storyboard.InstantiateInitialViewController();
Window.RootViewController = rootViewController;
Window.MakeKeyAndVisible();
}
一旦验证了用户的凭据,以下代码将尝试将RootViewController再次设置回原始的"DashboardViewController"并显示该视图。这是通过登录控制器完成的。
partial void LoginBtn_TouchUpInside (UIButton sender)
{
var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
appDelegate.SetRootViewController (dashboardViewController, true);
this.PresentViewController (dashboardViewController, true, null);
}
以下是AppDelegate中"SetRootViewController"的代码:
public void SetRootViewController()
{
Window = new UIWindow(UIScreen.MainScreen.Bounds);
var storyboard = UIStoryboard.FromName("Main", NSBundle.MainBundle);
bool isLoggedOut = false;
UIViewController rootViewController;
if (isLoggedOut)
rootViewController = (UIViewController)storyboard.InstantiateViewController ("ViewController");
else
rootViewController = (UIViewController)storyboard.InstantiateViewController (viewController);
Window.RootViewController = rootViewController;
Window.MakeKeyAndVisible();
}
到目前为止,这是有效的,但如果我尝试在DashboardViewController(它是一个UINavigationController)中的堆栈中添加另一个视图,通过使用以下代码点击按钮,
partial void ProfileBtn_TouchUpInside (UIButton sender)
{
this.NavigationController.PushViewController (profileViewController, true);
}
NavigationController为null,应用程序崩溃。因此,此场景的基本流程是"将RootViewController设置为"ViewController",以便用户可以登录-->当用户登录时,将RootView控制器设置回DashboardViewController并显示该视图-->单击按钮从DashboardView Controller视图导航到另一个视图,但DashboardViewer中的NavigationController为空。
我做错了什么??如果有任何帮助或建议,我们将不胜感激(我为这个长问题道歉)。
我决定把这个问题留给那些可能遇到同样问题的人。我已经找到了我认为的解决方案。在我的AppDelegate"SetRootViewController"方法中,而不是说
Window.RootViewController = rootViewController;
我需要说的是,
Window.RootViewController = new UINavigationController(rootViewController);
其他一切都保持不变。工作流程现在按预期工作。这是因为我试图设置为RootViewController的控制器不仅仅是UIViewController,它是由UINavigationController包装的UIViewController。这个答案也在下面的链接中重申
https://forums.xamarin.com/discussion/23424/how-can-i-use-this-navigationcontroller-on-my-view
我很抱歉回答了我自己的问题,如果有人有更好的方法或发现问题,请告诉我。希望这对将来的人有所帮助。