我如何将 SWRevealViewController 与 unwind segues 一起使用?

How do I use SWRevealViewController with unwind segues?

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

  1. 要从所有这些菜单中打开后菜单视图;
  2. 能够导航 使用 Unwind segues 返回堆栈。

我发现如果我使用常规的 push segues 将视图控制器推到彼此之上,那么展开的 segue 会按预期工作,但是每个视图控制器上的 self.revealViewController 没有设置并且菜单可以' 使用 revealToggle: 选择器调用。

如果我将推送 segues 更改为 SWRevealViewControllerSeguePushController 的子classes,那么视图将被推送到彼此之上,并且可以使用 revealToggle 从它们中的任何一个调用菜单。不幸的是,unwind segues 停止工作(我认为这可能是因为视图控制器是使用 addChild 而不是 SWRevealViewController class 上的 pushViewController 堆叠的)。

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

下面是一个故事板示例:

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

正如我之前所说,如果底部视图控制器之间的转场是常规的推送转场,那么展开转场会按预期工作;第一个视图控制器的菜单按钮有效(因为它直接连接到 SWRevealViewController),但第三个视图控制器的菜单按钮不起作用。

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

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

我 post 在 SWRevealViewControllers github site 上编辑了这个问题并收到了 Patrick Bodet 的回答,他非常有帮助。我会post下面的答案,这样它可能会帮助那些和我有同样情况的人。

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

如图所示,我希望能够将视图控制器推到彼此之上,并将 segues 展开到登录屏幕(从菜单)和堆叠视图控制器。

在我之前的尝试中,SWRevealViewController 似乎无法处理适当的导航转场。 Patrick 的第一个建议是将原始导航控制器从 RevealViewController 之前移动到 First 视图控制器之前。这确实有效,因为我仍然需要能够从菜单转到登录屏幕,所以我需要一个额外的导航控制器。

按照帕特里克的建议,我添加了一个额外的导航控制器。令人尴尬的是,最后我意识到从第三个视图控制器指向第一个视图控制器的按钮对第一个视图控制器有一个 ibaction 和一个 segue,所以这就是为什么它表现得很奇怪! :-(

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

第一和第三视图控制器的代码是这样的:

#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