在导航控制器外部创建UIViewController

时间:2013-11-06 09:35:30

标签: ios iphone objective-c uiviewcontroller

我有一个问题要问你。我正在开发这个具有演练/教程屏幕以及登录屏幕的应用程序。在每个屏幕上都有一个跳过此部分的按钮,直接使用该应用程序,无需完成注册(您知道,以便人们可以在登录前对其进行测试)。

Controllers as seen in the Storyboard

正如您所看到的,我正在使用Storyboard。 NowPlaying04 ViewController实际上是应用程序本身。显然,当用户是注册用户时,我也应该能够直接跳回到该屏幕,跳过漫游和登录过程。

第一个问题是:如何构建这个结构的最佳方法是什么?

第二个问题是:我如何在导航控制器之外创建一个ViewController。因为您现在可以看到,NowPlaying04 ViewController继承了顶部导航栏。这是我不想要的东西。我不需要那个。

我希望你理解我的问题。我会感激任何帮助。通过编程或拖动周围的东西,我对所有的解决方案都很满意。重要的是它工作正常! : - )

5 个答案:

答案 0 :(得分:2)

如果你只是想隐藏导航栏,但是这个代码是你的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 :(得分:1)

问题1:

您可以设置跳过按钮的实现,以导航到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; 

答案 2 :(得分:1)

@ user1447316,我很高兴你喜欢我的想法。但是,我宁愿使用 standarduserdefaults 而不是本地变量userLoggedIn。当您想要保存用户关闭应用程序时所需的少量数据(如高分,登录信息和程序状态)时,以这种方式保存非常有用。

用户通过以下方式从应用程序中的任何位置登录后,您可以保存数据:

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

然后你可以通过检索来检查:

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

e.x。这个不错的技术将允许您甚至检测您的第一次启动并向用户显示一些教程:)

答案 3 :(得分:0)

如果我是你,我会将寄存器VC作为模态出现。

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

答案 4 :(得分:0)

所以我可能会使用AppDelegate.m找到解决此问题的方法。如果您正在使用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属性在视图控制器上设置标识符。为BOOL变量设置不同的值userLogged在app中加载相对的rootViewController。

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

Storyboard after edit

哪个更有条理。 isInitialViewController在NowPlaying04屏幕上标记。但AppDelegate根据isLoggedIn BOOL变量决定是否转到它或者转而使用NavigationController(带有ID Start00)。

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