Ios 使UIViewController位于导航控制器外部

Ios 使UIViewController位于导航控制器外部,ios,iphone,objective-c,uiviewcontroller,Ios,Iphone,Objective C,Uiviewcontroller,我有个问题要问你。我正在开发这个应用程序,它有一个演练/教程屏幕和登录屏幕。在每个屏幕上都有一个按钮,可以跳过此部分并直接使用该应用程序,而无需完成注册(您知道,这样人们可以在登录前对其进行测试) 正如你所看到的,我正在使用故事板。NowPlaying04 ViewController实际上就是应用程序本身。显然,当用户是注册用户时,我也应该能够跳回该屏幕,跳过演练和登录过程 第一个问题是:构建这一体系的最佳方式是什么 第二个问题是:如何在导航控制器之外创建ViewController。原因正

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

正如你所看到的,我正在使用故事板。NowPlaying04 ViewController实际上就是应用程序本身。显然,当用户是注册用户时,我也应该能够跳回该屏幕,跳过演练和登录过程

第一个问题是:构建这一体系的最佳方式是什么

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


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

如果我是你,我会将寄存器VCs显示为一个模式

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

如果我是你,我会将注册VCs作为一个模式

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

如果您只想隐藏导航栏,但将此代码隐藏到您的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];
NSInteger索引=-1;
NSArray*arr=[[NSArray alloc]initWithArray:self.navigationController.ViewController];

对于(int i=0;i,如果您只想隐藏导航栏,但将此代码保存到您的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];
NSInteger索引=-1;
NSArray*arr=[[NSArray alloc]initWithArray:self.navigationController.ViewController];
对于(int i=0;i问题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方法或viewWillAspect方法中,只需将导航栏设置为隐藏

navBar.hidden = YES; 
问题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方法或viewWillAspect方法中,只需将导航栏设置为隐藏

navBar.hidden = YES; 

因此,我可能找到了解决此问题的方法,使用AppDelegate.m。如果您使用的是故事板,则不需要在AppDelegate.h中导入ViewController类,因为您使用的是故事板ID引用它们。它看起来像这样:

- (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设置一个不同的值,并使用相对rootViewController加载

现在,情节提要如下所示:

- (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;
}

它的组织性更强。isInitialViewController在NowPlaying04屏幕上被标记。但是AppDelegate根据isLoggedIn BOOL变量决定是转到它还是切换到NavigationController(ID为Start00)


感谢@khаааГааааГааааааааааааааааааааа他的:

- (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设置一个不同的值,并使用相对rootViewController加载

现在,情节提要如下所示:

- (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;
}

它的组织性更强。isInitialViewController在NowPlaying04屏幕上被标记。但是AppDelegate根据isLoggedIn BOOL变量决定是转到它还是切换到NavigationController(ID为Start00)


感谢@khаааГаааааааааааааааааааааааааer用户关闭了您的应用程序,例如高分、登录信息和程序状态

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

NSNumber *userLoggedIn = [NSNumber numberWithBool:NO];
[[NSUserDefaults standardUserDefaults] setObject:userLoggedIn forKey:@"log"];
然后您可以通过检索以下内容进行检查:

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

e、 这个不错的技术甚至可以让你检测到你的第一次发射,并向用户展示一些教程:)

@user1447316,我很高兴你喜欢我的想法。但是,我宁愿使用标准用户默认值而不是局部变量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.这项很好的技术甚至可以让您检测到您的首次启动,并向用户显示一些教程:)

以检查用户是否已签名使用[NSUserDefaults standardUserDefaults],根据情况使用不同的rootviewcontroller并跳过所有的签名vc。@。告诉我更多关于这个!现在,我已经在AppDelegate中设置了一个BOOL值(只是为了测试这一点):
-(BOOL)application:(UIApplication*)application didnishlaunchingwithoptions:(NSDictionary*)launchOptions{BOOL userLoggedIn=NO;if(userLoggedIn){self.window.rootViewController=[[NowPlaying04 alloc]init];}else{self.window.rootViewController=[[walkthrowh01 alloc]init];}}