SWRevealViewController устанавливает делегата на целевом ViewController

У меня возникли проблемы с определением destinationViewController с помощью SWRevealViewController

На некоторых ViewControllers я использовал метод 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;
    }

Эти viewControllers напрямую связаны через Segues на раскадровке. И с помощью этого метода я могу идентифицировать targetViewcontroller и установить его как делегата.

Однако у меня есть BarButtonItem в моем FirstViewController, который подключен к MenuViewController следующим образом в методе viewDidLoad

   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;

Однако я не могу идентифицировать MenuViewControler с помощью метода viewDidLoad, и я не уверен, как реорганизовать кнопку боковой панели, чтобы использовать именованный переход раскадровки.


person Linda Keating    schedule 10.09.2015    source источник


Ответы (2)


SWRevealViewController имеет контроллер заднего вида и frontViewController. Итак, вы хотите сделать это?

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

person tbilopavlovic    schedule 10.09.2015
comment
Спасибо. Это было именно то, что я искал. - person Linda Keating; 10.09.2015
comment
Однако у меня все еще есть проблема: поскольку я назначаю делегата в методе viewDidLoad, когда экземпляр MenuVC не был создан, поэтому два viewController не имеют ссылки друг на друга, поэтому методы делегата не срабатывают. Не уверен, как это преодолеть. Обычно я бы использовал prepareForSegue, но я не вижу способа настроить Segues для этого конкретного случая с помощью SWReveal. - person Linda Keating; 10.09.2015
comment
Вы можете подклассировать контроллер, а в методе viewDidLoad установить контроллер заднего и переднего вида... Зачем вам нужен делегат из меню в вашем frontViewController? Вы можете общаться через контроллер раскрытия. - person tbilopavlovic; 10.09.2015
comment
Один из вариантов в меню - «Поделиться экраном», поэтому, когда выбран общий доступ, мне нужно, чтобы меню было закрыто, и был сделан снимок экрана контроллера представления, которым я могу поделиться. Если я подключу shareButton к PresentingViewController через переход, он перезагрузит PresentingViewController, но содержимое интерфейса будет другим. - person Linda Keating; 10.09.2015
comment
Затем вы можете в MenuController в методе общего доступа захватить раскрыватьViewController.frontViewController.view и закрыть меню, вызвав метод раскрыватьViewController toogle... - person tbilopavlovic; 10.09.2015
comment
О, это блестящее решение. Спасибо. - person Linda Keating; 10.09.2015

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) {}
person kalyan711987    schedule 02.11.2017