繁体   English   中英

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

[英]Programmatically changing view in ECSlidingViewController

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

更新2014年7月14日:

仅当使用自定义视图控制器转换时,sidemenu才会隐藏。 例如在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中,并且由来自Settings'单元格的segue模态呈现)

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

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

ECSlidingViewController *slidingController = self.slidingViewController;

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

经过一些进一步的调查,我发现顶视图控制器的( MyViewControllerECSlidingViewController属性返回ECSlidingViewController的实例而不是MESettingsViewController ,即使它是以模态方式呈现MyViewControllerMESettingsViewController

并且因为实际呈现模态视图的ECSlidingViewController ,unwind处理程序无法正常工作,因为它将模态视图保留在屏幕上。

解:

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

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

}

或者使用委托模式并将其放入MESettingsViewController

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM