【问题标题】:View hierarchy changed after push a view controller through navigation controller?通过导航控制器推送视图控制器后视图层次结构发生了变化?
【发布时间】:2016-11-30 23:35:44
【问题描述】:

视图层次结构存在问题。这是我的应用程序的流程。

当应用启动时,视图控制器“A”是可见的。在通过“StoryBoard Reference (Push)”加载故事板“B”之后,另一个导航控制器出现并加载了主屏幕。单击主屏幕侧面板中的菜单按钮时可见。

现在,当我点击侧面板菜单项时,view Controller "B" 被推送。此视图控制器被推送到主屏幕下,并且不可见。

帮助视图控制器主控制器下可见。我希望 Help View Controller 位于 Home 控制器之上。 我不明白这是什么问题。。 任何帮助将不胜感激..

【问题讨论】:

  • 你在导航控制器上推侧边菜单吗?还是展示它?
  • 我在导航控制器上展示侧面板,然后在菜单操作特定视图控制器上被推送。
  • 检查我的答案!!

标签: ios uinavigationcontroller hierarchy pushviewcontroller


【解决方案1】:

如果您从图像中显示的侧面板推送视图控制器,则永远不会推送,因为它不在导航控制器中。

答案取决于你如何展示你的侧边菜单,但来自假设

你需要做的是设置根视图控制器或保持导航控制器的引用并从那里推送

【讨论】:

  • 感谢您的回答,侧面板显示在主控制器上。调试后,我知道帮助视图控制器被推送到导航控制器上,但它位于主视图控制器下。任何帮助?
【解决方案2】:

如果你正在展示侧边菜单,那么它不在navigation controller 上,所以你应该首先dismiss 这个侧边菜单,完成后你应该推送新的视图控制器(比如 B 或帮助)。我正在编写我在项目中用于演示的代码 sn-p,

 - (IBAction)settingClick:(id)sender {



SettingViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"settingsScreen"];



[self dismissViewControllerAnimated:NO completion:^{


    [self.vc.navigationController.navigationController pushViewController:svc animated:YES];


        }];


}

上述方法在关闭 side menu 后将 setting view controller 推送到当前 navigation controller

现在重要的是self.vc 这是previous viewcontroller 的对象(我认为在你的情况下是家庭控制器)在哪个侧面菜单上显示。

所以我的SideMenuViewController 有一个类似的属性,

 @property (nonatomic,strong) UIViewController *vc;

我在前一个视图控制器中使用self 进行设置(在您的情况下来自主视图控制器)类似,

    SideMenuViewController *smvc = [self.storyboard instantiateViewControllerWithIdentifier:@"sideMenu"];



            smvc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
            [self presentViewController:smvc animated:NO completion:^{


                smvc.vc = self;

            }];

我使用了[self.vc.navigationController.navigationController pushViewController:svc animated:YES];,即两个导航控制器来推送,因为我的视图层次结构中有两个导航控制器来推送这个新的视图控制器。

您可以根据您的设置来管理您拥有多少导航控制器!

希望这会有所帮助:)

【讨论】:

  • 我用过这个,但没有成功。
  • 。我还使用了以下方法.. [self performSelector:@selector(pushViewController) withObject:nil afterDelay:1.0]; - (void)pushViewController { RGNavigationController navVC =(RGNavigationController) self.frostedViewController.contentViewController; HelpController *helpVC = [self.storyboard instantiateViewControllerWithIdentifier:@"HelpController"]; if ([navVC.topViewController isKindOfClass:[HelpController class]]) { [self.frostedViewController hideMenuViewController];返回; } [navVC pushViewController:helpVC 动画:YES]; }
【解决方案3】:

经过大量挖掘,我找到了解决方案。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Home" bundle: nil];
RootController *someViewController = [storyboard instantiateViewControllerWithIdentifier:@"RootController"];
[self.navigationController pushViewController:someViewController animated:YES];

我已将另一个导航控制器设置为窗口的根 ViewController,它对我有用。 谢谢。

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2015-12-22
    • 2013-04-27
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多