1

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

故事板中看到的控制器

如您所见,我正在使用情节提要。NowPlaying04 ViewController 实际上是应用程序本身。显然,当用户成为注册用户时,我也应该能够直接跳回该屏幕,跳过演练和登录过程。

第一个问题是:如何构建它的最佳方式是什么?

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

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

4

5 回答 5

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];
于 2013-11-06T09:48:38.797 回答
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
  }

ex 这个很好的技术甚至可以让你检测到你的第一次启动并向用户展示一些教程:)

于 2013-11-06T14:46:12.240 回答
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; 
于 2013-11-06T09:50:07.977 回答
0

如果我是你,我会将注册 VC 呈现为模态。

if (!registered){
     [nowPlaying04  presentViewController:registrationNav animated:YES completion:nil];
}
于 2013-11-06T09:46:50.400 回答
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 变量 userLoggedIn 设置不同的值,应用程序会使用相对的 rootViewController 加载。

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

编辑后的故事板

哪个更有条理。isInitialViewController 在 NowPlaying04 屏幕上被标记。但是 AppDelegate 根据 isLoggedIn BOOL 变量决定是转到它还是切换到 NavigationController(ID 为 Start00)。

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

于 2013-11-06T14:03:43.973 回答