在导航控制器之外制作UIViewController

我有一个问题问你。 我正在开发这个应用程序,其中有一个演练/教程屏幕,也login。 在每个屏幕上都有一个button可以跳过这个部分,直接使用应用程序,而无需完成注册(您知道,这样人们可以在login前testing它)。

在Storyboard中看到的控制器

正如你所看到的我正在使用故事板。 NowPlaying04 ViewController实际上是应用程序本身。 显然,当用户将是一个注册的,我也应该能够跳回到该屏幕,跳过漫游和login过程。

第一个问题是:如何构build这个最好的方法?

第二个问题是:我怎样才能使该导航控制器以外的ViewController。 因为你现在可以看到,NowPlaying04 ViewControllerinheritance了顶部导航栏。 这是我不想要的东西。 我不需要那个

我希望你能理解我的问题。 我会感谢任何帮助。 以编程方式或通过拖动东西,我确定所有的解决scheme。 重要的是它正常工作! 🙂

如果你只是想隐藏导航栏,但是这个代码到你的ViewController.m:

 - (void)viewWillAppear:(BOOL)animated{ [self.navigationController setNavigationBarHidden:YES animated:animated]; } - (void)viewWillDisappear:(BOOL)animated{ [self.navigationController setNavigationBarHidden:NO animated:animated]; [super viewWillDisappear:animated]; } 

要跳转到特定的ViewController,您可以使用以下代码:

 NSInteger index = -1; NSArray* arr = [[NSArray alloc] initWithArray:self.navigationController.viewControllers]; for(int i=0 ; i<arr.count ; i++) { if([[arr objectAtIndex:i] isKindOfClass:NSClassFromString(@"Your_ViewController_Class_Name")]) { index = i; } } [self.navigationController popToViewController:[arr objectAtIndex:index] animated:YES]; 

问题1:

您可以设置跳过button的实现来导航到NowPlaying04视图控制器。

  UIButton* skipButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [skipButton addTarget:self action:@selector(skip) forControlEvents:UIControlEventTouchUpInside]; -(void)skip { NowPlaying04* nowPlayingController = [[NowPlaying04 alloc] init]; [self.navigationController pushViewController:nowPlayingController animated:YES]; } 

问题2:

将导航栏设置为隐藏在NowPlaying04中。 在NowPlaying04的init方法或viewWillAppear方法中,只需将导航栏隐藏即可。

 navBar.hidden = YES; 

@ user1447316,我很高兴你喜欢我的想法。 但是,我宁愿使用standarduserdefaults而不是本地variablesuserLoggedIn。 如果您希望在用户closures应用程序(例如高分,login信息和程序状态)后保存less量数据,则这种方式非常有用。

用户通过以下方式从应用程序中的任意位置进行login后,即可保存数

 NSNumber *userLoggedIn = [NSNumber numberWithBool:NO]; [[NSUserDefaults standardUserDefaults] setObject:userLoggedIn forKey:@"log"]; 

然后你可以检索:

  NSNumber *userLoggedIn = [[NSUserDefaults standardUserDefaults]objectForKey:@"log"]; if ([userLoggedIn boolValue]){ //user logged } 

前这个不错的技术将让你甚至可以检测到你的第一次启动,并显示给用户一些教程:)

如果我是你,我会把注册风险投资作为一种模式。

 if (!registered){ [nowPlaying04 presentViewController:registrationNav animated:YES completion:nil]; } 

所以我也许使用AppDelegate.mfind了解决这个问题的方法。 如果您使用的是Storyboard,则无需在AppDelegate.h中导入ViewController类,因为您正在使用StoryboardID引用它们。 它看起来像这样:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { BOOL userLoggedIn = NO; if (userLoggedIn) { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"NowPlaying04"]; [self.window setRootViewController:controller]; } else { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Start00"]; [self.window setRootViewController:controller]; } [self.window makeKeyAndVisible]; // Override point for customization after application launch. return YES; } 

显然你需要通过InterfaceBuilder / Storyboard属性在视图控制器上设置标识符。 为BOOLvariables设置一个不同的值userLogged在应用程序中加载相对的rootViewController。

现在故事板看起来像这样:

编辑后的故事板

哪个更有组织。 isInitialViewController在NowPlaying04屏幕上被标记。 但是,AppDelegate决定是否转到它,或者切换到基于isLoggedIn BOOLvariables的NavigationController(ID为Start00)。

感谢@НаильГалиаскаров使用不同的rootViewControllers的想法。