【问题标题】:How do I use SWRevealViewController with unwind segues?如何将 SWRevealViewController 与展开转场一起使用?
【发布时间】:2016-05-03 12:21:57
【问题描述】:

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

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

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

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

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

下面是一个示例故事板:

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

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

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

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

【问题讨论】:

  • 不确定您的具体问题,但此链接帮助我使用 SWRevealVC youtube.com/watch?v=EWDNScxZ0YU
  • 嗨 MikeG!感谢您的答复。不幸的是,视频并没有准确显示我需要的内容,这是一个视图控制器在被 SWRevealViewController 推送时执行 segues。然而,SWRevealViewController git 项目的 Patrick Bodet 帮助了我,接下来我会发布他给我的答案。

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


【解决方案1】:

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

我必须更新情节提要并添加一个额外的导航控制器,如下所示。

如图所示,我希望能够将视图控制器相互叠加,同时也可以解除登录屏幕(从菜单)和堆叠视图控制器的连接。

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

按照 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

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 2014-07-01
    • 2014-07-18
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多