[英]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];
经过一些进一步的调查,我发现顶视图控制器的( MyViewController
) ECSlidingViewController
属性返回ECSlidingViewController
的实例而不是MESettingsViewController
,即使它是以模态方式呈现MyViewController
的MESettingsViewController
。
并且因为实际呈现模态视图的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.