【问题标题】:Programmatically changing view in ECSlidingViewController以编程方式更改 ECSlidingViewController 中的视图
【发布时间】:2015-05-21 18:45:08
【问题描述】:

我正在尝试以编程方式更改选定的菜单项和显示的 topViewController。换句话说,我正在尝试做同样的事情来更改 UITabBarController 中的选定选项卡:

[self.tabBarController setSelectedIndex:2];

因此,根据另一个 SO 问题 (https://stackoverflow.com/a/20309377/1161723),我正在使用它来更改显示的 topViewController:

[self.slidingViewController anchorTopViewToRightAnimated:NO];
self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[self.slidingViewController resetTopViewAnimated:NO];

但它不起作用。好吧,前两行工作正常,分别显示菜单和更改 topViewController,但最后一行根本不隐藏 sidemenu,所以它一直在那里,直到我通过手势或点击按钮隐藏它。调试显示最后一个self.slidingViewController 返回nil 而不是ECSlidingViewController 的实例。如果我跳过第一行和最后一行,只留下:

self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];

它会使应用程序崩溃。

知道如何通过隐藏侧边菜单正确更改视图吗?我正在使用 ECSlidingViewController 2.0.1

编辑: 使用竞争块和/或创建对滑动视图控制器的引用没有任何区别:

ECSlidingViewController *slidingViewController = self.slidingViewController;
[slidingViewController anchorTopViewToRightAnimated:NO onComplete:^{
    slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
   [slidingViewController resetTopViewAnimated:NO];
}];

2014 年 7 月 14 日更新:

仅当使用自定义视图控制器转换时,侧边菜单才不会隐藏。例如TransitionFun example

在 unwind segue 处理程序中仅保留以下内容时应用程序崩溃:

- (IBAction)unwindModalView:(UIStoryboardSegue *)sender
{
    ECSlidingViewController *slidingViewController = [self slidingViewController];
    slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"];
}

注意:如果显示最后一个视图控制器(从其中调用 unwind segue) 通过 push segue 而不是 modal segue,应用不会崩溃。

你可以在图片here上看到视图控制器的层次结构

(基本上是 TransitionFun 示例,在 NavigationVC 中封装了另外一个 VC,并由设置单元格中的 segue 模态呈现)

【问题讨论】:

    标签: ios ecslidingviewcontroller ecslidingviewcontroller-2


    【解决方案1】:

    self.slidingViewController 是一个计算变量。计算是通过导航视图控制器层次结构来完成的。因此,如果视图控制器作为更改的一部分从层次结构中移除,那么 self.slidingViewController 将停止工作。

    继续调用它也是非常低效的。改为:

    ECSlidingViewController *slidingController = self.slidingViewController;
    
    [slidingController anchorTopViewToRightAnimated:NO];
    slidingController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
    [slidingController resetTopViewAnimated:NO];
    

    【讨论】:

    • 我已经尝试过了(请参阅编辑后的问题),但不幸的是,这也不起作用。
    • 因此,您需要提供有关此代码所在视图控制器的更多详细信息,以及它与滑动控制器的关系。还要提供您看到的异常的详细信息。
    • 问题似乎包括两件事:1)当使用自定义视图控制器转换(例如TransitionFun演示项目)时,侧边栏没有隐藏。 2) 当从模态显示的视图中调用仅包含 slidingController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"]; [slidingController resetTopViewAnimated:NO]; 的展开 segue 时,应用程序在没有任何控制台日志的情况下崩溃。
    【解决方案2】:

    经过进一步调查,我发现顶视图控制器 (MyViewController) 的presentingViewController 属性返回了ECSlidingViewController 的实例而不是MESettingsViewController,即使是MESettingsViewController 呈现了MyViewController模态的。

    因为它是ECSlidingViewController 实际上呈现模态视图,展开处理程序没有工作,因为它离开了屏幕上的模态视图。

    解决方案:

    忘记展开转场,在模态显示的顶视图控制器 (MyViewController) 中使用以下代码来更改 ECSlidingViewController 的 topViewController 属性:

    - (IBAction)switchToTransitionsScreen:(id)sender
    {
        self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"];
        [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    
    }
    

    或者使用委托模式并将其放入MESettingsViewController,例如。

    【讨论】:

      【解决方案3】:

      万一有人没有找到答案,我就是这样弄的。

      1- #import "UIViewController+ECSlidingViewController.h" 到 menuViewController 2- 将destinationViewController 的 stroboardID 设置为 "someID" 3- 在后端触发某些操作时,使用以下代码:

      if(self.slidingViewController.currentTopViewPosition == ECSlidingViewControllerTopViewPositionCentered){
          [self.slidingViewController anchorTopViewToRightAnimated:YES];
      }
      else{
          self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"someID"];
          [self.slidingViewController resetTopViewAnimated:YES];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多