以编程方式更改ECSlidingViewController中的视图

时间:2014-03-11 23:46:31

标签: ios ecslidingviewcontroller ecslidingviewcontroller-2

我尝试以编程方式更改所选菜单项和显示的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,但最后一行根本不隐藏侧面菜单,所以它保持在那里直到我通过手势或点击按钮隐藏它。调试显示最后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];
}];

更新14.7.2014:

仅当使用自定义视图控制器转换时,sidemenu才会隐藏。例如,在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示例,其中一个VC封装在NavigationVC中,并通过设置'单元格中的segue模式显示)

3 个答案:

答案 0 :(得分:2)

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

继续打电话也是非常低效的。改为:

ECSlidingViewController *slidingController = self.slidingViewController;

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

答案 1 :(得分:0)

经过一些进一步调查后,我发现顶视图控制器(MyViewController)presentsViewController属性返回ECSlidingViewController而不是MESettingsViewController的实例,即使它是以模拟方式显示MESettingsViewController的{​​{1}}。

因为它的MyViewController 实际呈现模态视图,所以展开处理程序不起作用,因为它将模态视图留在屏幕上。

<强>解决方案:

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

MyViewController

或者使用委托模式并将其放入- (IBAction)switchToTransitionsScreen:(id)sender { self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"]; [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; } ,例如。

答案 2 :(得分:0)

如果有人没有找到答案,我就这样做了。

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];