Как использовать отклонить всплывающее окно iPhone в раскадровке

Я хотел бы использовать решение, предоставленное Трэвисом М. на этот вопрос: Как использовать закрытие всплывающего окна iPhone в адаптивной раскадровке

Однако мне нужно, чтобы приведенное ниже было переведено в цель c.

Кто-нибудь может помочь?


Если вам нужно всплывающее окно на вашем iPad, но модальный лист с кнопкой закрытия на вашем iPhone, вы можете сделать это, не создавая дополнительный навигационный контроллер в раскадровке для всплывающего окна.

В раскадровке Xcode 6.3 вы просто подключаете контроллер представления и назначаете переход как «Представить как всплывающее окно».

Приведенный ниже код должен находиться в контроллере представления, который переходит к всплывающему меню, а не в самом всплывающем окне:

Сначала вы настраиваете делегат popover:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "myPopoverSegueName") {
        let vc = segue.destinationViewController
        vc.popoverPresentationController?.delegate = self
        return
    }
}

Затем вы добавляете расширение делегата (под кодом вашего контроллера представления) и создаете кнопку контроллера навигации/закрытия на лету:

extension myViewController: UIPopoverPresentationControllerDelegate {

func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        let btnDone = UIBarButtonItem(title: "Done", style: .Done, target: self, action: "dismiss")
        let nav = UINavigationController(rootViewController: controller.presentedViewController)
        nav.topViewController.navigationItem.leftBarButtonItem = btnDone
        return nav
    }
}

Затем вы добавляете расширение делегата (под кодом вашего контроллера представления) и создаете кнопку контроллера навигации/закрытия на лету:

extension myViewController: UIPopoverPresentationControllerDelegate {

    func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        let btnDone = UIBarButtonItem(title: "Done", style: .Done, target: self, action: "dismiss")
        let nav = UINavigationController(rootViewController: controller.presentedViewController)
        nav.topViewController.navigationItem.leftBarButtonItem = btnDone
        return nav
    }
}

Затем вы добавляете свою функцию отклонения, и все должно быть хорошо:

func dismiss() {
    self.dismissViewControllerAnimated(true, completion: nil)
}

person ArnoldJP    schedule 13.12.2015    source источник


Ответы (1)


Это не так уж отличается от Objective-C. Вы, вероятно, могли бы понять, что происходит, просто взглянув на него. Это просто настройка подготовки к переходу и реализация части протокола.

myViewController должен объявить себя соответствующим UIAdaptivePresentationControllerDelegate. Тогда это код.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([[segue identifier] isEqualToString:@"myPopoverSegueName"]) {
            UIViewController *viewController = segue.destinationViewController;
            viewController.popoverPresentationController.delegate = self
        }
    }

- (UIViewController *)presentationController:(UIPresentationController *)controller
  viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style
{
            UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismiss)];
            UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller.presentedViewController];
           navController.topViewController.navigationItem.leftBarButtonItem = doneButton;

}

-(void) dismiss
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

Вам не нужно использовать расширение или категорию. Не собираюсь ручаться за то, делает ли это то, что говорит Трэвис М..

person beyowulf    schedule 13.12.2015
comment
Решение вроде работает, спасибо. Я получаю одно предупреждение о том, что присвоение «id UIPopoverPresentationControllerDelegate› _Nullable» из несовместимого типа «BVBSettings * const __strong» BVBSettings — это имя viewController, представляющее контроллер всплывающего окна в строке viewController.popoverPresentationController.delegate = self; - person ArnoldJP; 14.12.2015
comment
Объявите BVBSettings как соответствующие протоколу UIPopoverPresentationControllerDelegate. - person beyowulf; 14.12.2015