Перейти к контроллеру представления по нажатию кнопки внутри UIPopoverPresentationController

У меня есть контроллер табличного представления с ячейкой, в которой есть кнопка.

При нажатии этой кнопки я отображаю контроллер представления как UIPopoverPresentationController.

Этот поп-контроллер имеет две кнопки, YES и NO.

По щелчку YES я хочу перейти к другому контроллеру представления, а по щелчку NO я отклоню всплывающий контроллер.

По щелчку НЕТ, всплывающее окно отклоняется, но по щелчку ДА я не перемещаюсь в требуемый контроллер вида.

Хотя представление действительно загрузило метод () этого контроллера представления вызывается. Проблема в том, что новый контроллер представления не отображается.

При нажатии кнопки YES всплывающее окно отклоняется, но остается на предыдущем контроллере представления.

Ниже мой код

Класс TableViewController

func onTapPickButton(sender: UIButton) { 

 let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
        let popoverViewController = storyboard.instantiateViewController(withIdentifier: "ConfirmDialogViewController") as! ConfirmDialogViewController 
        popoverViewController.preferredContentSize = CGSize(width: view.frame.width/1.33, height: view.frame.height/2.34) 
        popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover 
        let popover: UIPopoverPresentationController = popoverViewController.popoverPresentationController! 
        popover.sourceView = self.view 
        popover.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)         
        popover.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) 
        popover.delegate = self 

        present(popoverViewController, animated: true, completion: nil) 
}

PopOver View контроллер класса

@IBAction func onTapNoButton(_ sender: UIButton) { 
        self.dismiss(animated: true, completion: {}) 
    } 

    @IBAction func onTapYesButton(_ sender: UIButton) { 
        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let viewController = storyboard.instantiateViewController(withIdentifier: "View") as! ViewController
present(viewController, animated: true, completion: nil)

    } 

Любая помощь будет оценена. Спасибо.

2 ответа

Вы можете создать замыкание (обработчик завершения) или делегат для отлова при нажатии кнопки "ДА". Это было бы полезно в случае, если вы когда-нибудь захотите получить какие-либо данные из Popover ViewController. Например:

Обработчик завершения:

class ConfirmDialogViewController: UIViewController {
    open var didSelectYesHandler: ((_ selectedData: String) -> ())?

    public init(for sender: UIView, didSelectYesHandler: ((_ selectedData: String) -> ())? = nil) {
        super.init(nibName: nil, bundle: nil)

        modalPresentationStyle = .popover
        self.sender = sender
        self.didSelectDataHandler = didSelectDataHandler

        guard let popoverPC = popoverPresentationController else { return }
        popoverPC.sourceView = sender
        popoverPC.sourceRect = sender.bounds
        popoverPC.delegate = self
    }

    @IBAction func onTapYesButton(_ sender: UIButton) { 
        dismiss(animated: true, completion: nil)
        didSelectDataHandler?("YES")
    }

    // MARK: - PopoverPC Delegate Methods

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}

Делегат:

protocol ConfirmDialogViewControllerDelegate: class {
    func didSelectYes(_ selectedDate: String)
}

class ConfirmDialogViewController: UIViewController {
    weak var delegate: ConfirmDialogViewControllerDelegate?

    @IBAction func onTapYesButton(_ sender: UIButton) { 
        dismiss(animated: true, completion: nil)
        delegate?.didSelectData("YES")
    } 
}

// In your current view controller set 
popoverViewController.delegate = self

Бонус:

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

В действии кнопки ДА, отклонить popOver и в блоке завершения присутствует новый viewController

 @IBAction func onTapYesButton(_ sender: UIButton) { 
                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let viewController = storyboard.instantiateViewController(withIdentifier: "View") as! ViewController
                self.dismiss(animated: true, completion: {
                       self.present(viewController, animated: true, completion: nil)
                }) 

            } 
Другие вопросы по тегам