我尝试以编程方式更改所选菜单项和显示的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模式显示)
答案 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];