SWRevealViewController 在目标 ViewController 上设置委托

Posted

技术标签:

【中文标题】SWRevealViewController 在目标 ViewController 上设置委托【英文标题】:SWRevealViewController setting a delegate on the target ViewController 【发布时间】:2015-09-10 12:32:37 【问题描述】:

我无法使用SWRevealViewController 识别destinationViewController

在某些 ViewController 上,我使用prepareForSegue 方法来识别目的地,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

    if ([[segue identifier] isEqualToString:@"showHint"]) 
        HintsViewController *hintsVC = [segue destinationViewController];
        hintsVC.hintDelegate = self.controller;
        hintsVC.hintUsed = self.controller.hintUsed;
        hintsVC.firstLetterUsed = self.controller.firstLetterUsed;
        hintsVC.answersUsed = self.controller.answersUsed;
    

这些视图控制器通过故事板上的 Segue 直接连接。使用这种方法,我可以识别 targetViewcontroller 并将其设置为委托。

但是我的 FirstViewController 中有一个 BarButtonItem,它在 viewDidLoad 方法中连接到 MenuViewController,如下所示

   SWRevealViewController *revealViewController = self.revealViewController;
    if(revealViewController)
        [self.sideBarButton setTarget:self.revealViewController];
        [self.sideBarButton setAction:@selector(rightRevealToggle:)];

        revealViewController.rightViewRevealWidth = self.view.frame.size.width * 0.65;
    

这显示了 MenuViewController,它位于我想设置为委托的 MenuViewController 上。

所以理想情况下,我应该能够执行以下操作:

MenuViewController* menuVC = revealViewController.destinationViewController;
menuVC.delegate = self;

但是,我无法使用 viewDidLoad 方法识别 MenuViewControler,并且我不确定如何重构侧边栏按钮以使用命名的故事板 segue。

【问题讨论】:

【参考方案1】:

SWRevealViewController 有一个后视图控制器和一个前视图控制器。 所以你想这样做?

MenuViewController* menuVC = (MenuViewController*)revealViewController.rearViewController; menuVC.delegate = self;

【讨论】:

谢谢。这正是我想要的。 我仍然有一个问题 - 因为当 MenuVC 尚未实例化时我在 viewDidLoad 方法中分配委托,所以两个视图控制器没有相互引用,因此委托方法不会触发。不知道如何克服它。通常我会使用 prepareForSegue 但我看不到使用 SWReveal 为这种特殊情况设置 Segue 的方法 您可以子类化显示控制器并在 viewDidLoad 方法中设置后视图和前视图控制器...为什么需要从 frontViewController 中的菜单委托?您可以通过显示控制器进行通信.. One of the options on Menu is to Share the screen - so when the share is selected I need the Menu to be dismissed and a screengrab of the presentingviewcontroller to be made which I can then share.如果我通过 segue 将 shareButton 连接到 presentingViewController 它将重新加载 presentingViewController 但界面的内容会有所不同。 然后您可以在 MenuController 中的“share”方法中获取revealViewController.frontViewController.view 并通过调用revealViewController 工具方法关闭菜单...【参考方案2】:
if self.revealViewController() != nil 
                menuButton.target = self.revealViewController()
                menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
                self.revealViewController().delegate = self
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
                self.revealViewController().rearViewRevealWidth = 
            

以下是 swift4 中的代理测试:

func revealController(_ revealController: SWRevealViewController!, willMoveTo position: FrontViewPosition)     
func revealControllerPanGestureBegan(_ revealController:SWRevealViewController )
func revealController(_ revealController: SWRevealViewController, didMoveTo position: FrontViewPosition) 

【讨论】:

以上是关于SWRevealViewController 在目标 ViewController 上设置委托的主要内容,如果未能解决你的问题,请参考以下文章

带有 SWRevealViewController 的 ios 滑动状态栏

自定义 SWRevealViewController

SWRevealViewController 的 Segue 问题

如何通过单击按钮打开 SWRevealViewController?

SWRevealViewController 在目标 ViewController 上设置委托

使用 SWRevealViewController 时如何登录注销