0

我正在尝试以编程方式更改选定的菜单项和显示的 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 示例中。

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

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

注意:如果最后一个视图控制器(调用 unwind segue 的地方)由push segue 而不是modal segue 呈现,则应用程序不会崩溃。

您可以在此处查看图像上视图控制器的层次结构

(它基本上是 TransitionFun 示例,其中还有一个 VC 封装在 NavigationVC 中,并由设置单元格中的 segue 以模态方式呈现)

4

3 回答 3

2

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

继续调用它也非常低效。改成:

ECSlidingViewController *slidingController = self.slidingViewController;

[slidingController anchorTopViewToRightAnimated:NO];
slidingController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[slidingController resetTopViewAnimated:NO];
于 2014-03-11T23:53:21.077 回答
0

经过一些进一步的调查,我发现顶视图控制器的 ( 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,例如。

于 2014-03-15T16:13:07.867 回答
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];
于 2015-05-21T10:45:08.137 回答