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 的 Segue 问题
如何通过单击按钮打开 SWRevealViewController?