如何将SWRevealViewController与展开segue一起使用?

时间:2016-01-26 19:30:42

标签: objective-c xcode swift swrevealviewcontroller unwind-segue

我有一系列视图在导航控制器上相互挤压。我想用这些观点做两件事:

  1. 从所有这些视图打开后方菜单视图;
  2. 能够导航 使用Unwind segues返回堆栈。
  3. 我发现如果我使用常规推送segues将视图控制器推到彼此之上,那么展开segue会按预期工作,但是每个视图控制器上的self.revealViewController都没有设置,菜单也不能使用revealToggle:selector。

    调用

    如果我将push segues更改为SWRevealViewControllerSeguePushController的子类,则视图将被推到彼此之上,并且可以使用revealToggle从其中任何一个调用Menu。不幸的是,unwind segues停止工作(我想这可能是因为视图控制器是使用addChild而不是SWRevealViewController类上的pushViewController堆叠的。)

    有没有办法与SWRevealViewController和Unwind Segues一起工作?

    下面是一个示例故事板:

    SWRevealViewController and Unwind segue

    第一个视图控制器是导航控制器;第二个是SWRevealViewController;下面的三个视图控制器彼此导航,第三个视图控制器与第一个控制器的展开segue。第一个和第三个控制器具有打开菜单的按钮。

    正如我之前所说,如果底部视图控制器之间的segues是常规push segues,则unwind segue按预期工作;第一个视图控制器的菜单按钮工作(因为它直接连接到SWRevealViewController),但第三个视图控制器的菜单按钮不起作用。

    将segue类型切换为SWRevealViewControllerSeguePushController使第一个和第三个视图控制器的菜单按钮正常工作,但展开segue停止工作。

    哦,我测试了使用" popToRootViewControllerAnimated:"如果segue设置为SWRevealViewControllerSeguePushController,它也不起作用。

1 个答案:

答案 0 :(得分:2)

我在SWRevealViewControllers github site上发布了这个问题,并得到了Patrick Bodet的回答,他非常乐于助人。我将在下面发布答案,以便它可以帮助处理与我相同情况的人。

我必须更新故事板并添加了一个额外的导航控制器,如下所示。

enter image description here

如图所示,我希望能够将视图控制器推到彼此之上,并且还可以将segue展开到Login屏幕(从菜单)和堆叠视图控制器。

在我之前的尝试中,似乎SWRevealViewController无法应对正确的导航段。 Patrick的第一个建议是将原始导航控制器从RevealViewController之前移动到第一个视图控制器之前。这实际上是有效的,我仍然需要能够从菜单到登录屏幕展开segue,所以我需要一个额外的导航控制器。

根据Patrick的建议,我添加了一个额外的导航控制器。最后我尴尬地意识到从第三个到第一个视图控制器指向的按钮既有ibaction又有第一个segue,所以这就是为什么它表现得很奇怪! : - (

因此,对于上面显示的故事板,为了工作,您只需为视图控制器使用常规Push segues。无需使用SWRevealViewControllerSeguePushController segues。

First和Third视图控制器的代码如下:

#import "ThirdViewController.h"
#import "SWRevealViewController.h"
#import "FirstViewController.h"

@interface ThirdViewController ()
@property (weak, nonatomic) IBOutlet UIBarButtonItem *menuButton;
@end

@implementation ThirdViewController 
- (void)viewDidLoad {
    [super viewDidLoad];

    SWRevealViewController *revealViewController = self.revealViewController;

    if (revealViewController) {
        [self.menuButton setTarget: revealViewController];
        [self.menuButton setAction: @selector( revealToggle: )];
    }
}

- (IBAction)returnToFirst:(id)sender {
    [self performSegueWithIdentifier:@"First" sender:self];
    //[self.navigationController popToRootViewControllerAnimated:YES];
}  
@end