Перейти к контроллеру представления по нажатию кнопки внутри 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)
})
}