【问题标题】:ViewController Hierarchy - Remove UISplitviewController from stackViewController Hierarchy - 从堆栈中删除 UISplitviewController
【发布时间】:2015-02-02 20:49:29
【问题描述】:

我的应用有一个登录视图、一个加载视图、一个拆分视图和一个菜单视图。

启动时,初始视图是登录视图。当用户成功登录时,它会进入加载视图。加载数据后,我将呈现拆分视图。在拆分视图上,我有一个以模态方式呈现的菜单。菜单的选项之一是注销。当用户注销时,我想返回登录视图。到目前为止,一切顺利。

问题是,当我检查视图层次结构时,拆分视图仍在登录视图下方。理论上,用户可以通过这种方式创建具有无限数量的分层视图的情况。

如何让用户返回登录视图并关闭拆分视图?

我正在使用情节提要和转场来进入拆分视图。登录视图推送到加载视图,加载视图推送到拆分视图。我在自定义模态演示控制器中呈现模态菜单。

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller uisplitviewcontroller


    【解决方案1】:
                //VC1
    
    
                -(IBAction)button_click:(id)sender
                {
                    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                    ViewController2 *viewController2 = [storyboard instantiateViewControllerWithIdentifier:@"VC2"];
    
                    [self.navigationController pushViewController:viewController2 animated:YES];
                }
    
    
                //VC2
    
    
                -(IBAction)button_click:(id)sender
                {
    
                    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                    ViewController3 *viewController3 = [storyboard instantiateViewControllerWithIdentifier:@"VC3"];
    
                    [self.navigationController pushViewController:viewController3 animated:YES];
    
                }
    
                //VC3
        // In .h file
        @interface ViewController3 : UIViewController<ViewController4Delegate>
    
        -(IBAction)button_click:(id)sender;
    
        @end
    
             //In .m file   
                -(IBAction)button_click:(id)sender
                {
                    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                    ViewController4 *viewController4 = [storyboard instantiateViewControllerWithIdentifier:@"VC4"];
    
                    viewController4.delegate=self;
    
                    [self.navigationController presentViewController:viewController4 animated:YES completion:nil];
                }
    
                -(void)completed
                {
                    [self.navigationController popToRootViewControllerAnimated:YES];
    [self.parentViewController.parentViewController dismissViewControllerAnimated:YES completion:nil];
                }
    
                //VC4
                //In .h file
                @protocol  ViewController4Delegate
    
            -(void)completed;
    
            @end
    
            @interface ViewController4 : UIViewController
    
            -(IBAction)button_click:(id)sender;
    
            @property(nonatomic,weak) id <ViewController4Delegate> delegate
    
             //In.m file
                -(IBAction)button_click:(id)sender
                {
    
    
                    [self dismissViewControllerAnimated:NO completion:^{
    
                        if(delegate)
                        {
                            [delegate completed];
                        }
    
                    }];
                }
    

    【讨论】:

    • 嗯。不工作。它清除模态,但不清除拆分视图。模式视图设置为在用户注销时使用对详细视图的通知。当我在详细视图中收到通知时,我使用的是NSLog(@"rootview: %@", [self.view.window rootViewController]);,它以 root 身份报告登录视图。我尝试过使用和不使用完成块,两个版本都不会显示登录视图。
    • 给我 5 分钟我会修好它
    • 如果您遇到任何问题,请告诉我。我已经在我的应用中测试了它的工作正常。
    • 这里,VC3是一个拆分视图的详细视图。在 VC2 中,我使用 [self.navigationController presentViewController:viewController3 animated:YES completion:nil]; 呈现拆分视图我想知道拆分视图是否需要回调 VC1 而不是 VC3 本身...
    • 在 DetailViewcontroller(VC3) 上完整的方法 UINavigationController *navigationalController=(id)self.parentViewController。这将为您提供 splitview 控制器 navigationController [navigationController popToRootViewControllerAnimated:YES];
    【解决方案2】:

    你有这个 ViewController Hierarchy 的导航控制器吗?假设你有一个导航控制器:

    如果 LoginView 设置为 Navigation Controller 的 rootViewController,并且 LoadingView 和 SplitView 被“推送”到 Navigation Stack,那么您可以做的是关闭模式并在完成块中,您可以弹出到根视图控制器 -> 这将是您的登录控制器。

    因此,在您的 LogoutModal 中,您将在 Logout Button Click Handler 上执行此操作:

    [self.presentingViewController dismissViewControllerAnimated:YES completion:^{
        [self.presentingViewController.navigationController popToRootViewControllerAnimated:YES];
    }];
    

    这会关闭模式,然后一旦完成,它就会将导航堆栈一直弹出到根视图控制器。

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2015-05-31
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      相关资源
      最近更新 更多