Как представить Adyen Checkout, если я уже представляю контроллер? - PullRequest
2 голосов
/ 25 апреля 2020

Я столкнулся с проблемой, я использую таблицу в качестве боковой панели, чтобы представить определенный контроллер из приложения. При попытке предустановить Adyen checkout для оплаты, получая ошибку, которая говорит мне, что я не могу использовать мульти-презентацию, у меня возникает вопрос, как я могу исправить эту проблему? нажми или на pu sh боковую панель и представь другие контроллеры, но безуспешно или я не сделал это правильно.

Спасибо!

Это кнопка бокового меню помещается в MainViewController

public func setSideMenuButton()
    {
        let button = UIButton()
        button.frame = CGRect(x: self.view.frame.size.width - 65, y: self.view.frame.size.height - 160, width: 50, height: 50)
        button.setImage(#imageLiteral(resourceName: "side_menu_button").withRenderingMode(.alwaysOriginal), for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        self.view.addSubview(button)

    }

    @objc func buttonAction(sender: UIButton!)
    {
        pauseEachExistingVideoPlayer()

        guard let sideMenuViewController = storyboard?.instantiateViewController(withIdentifier: "SideMenuViewController") as? SideMenuViewController else { return }

        sideMenuViewController.modalPresentationStyle = .overCurrentContext
        sideMenuViewController.transitioningDelegate = self
        present(sideMenuViewController, animated: true)
    } 

Представление каждого индекса из табеля

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {

        switch indexPath.row {
        case 0: present( UIStoryboard(name: "Profile", bundle: nil).instantiateViewController(withIdentifier: "UserProfileVC") as UIViewController, animated: true, completion: nil)
        case 1: present( UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SR_VideoLibrary") as UIViewController, animated: true, completion: nil)
        case 2: present( UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SR_Livestream") as UIViewController, animated: true, completion: nil)
        case 3: return
        case 4: return
        case 5: present( UIStoryboard(name: "VideoLibrary", bundle: nil).instantiateViewController(withIdentifier: "ProjectsListVC") as UIViewController, animated: true, completion: nil)
        case 6: present( UIStoryboard(name: "Profile", bundle: nil).instantiateViewController(withIdentifier: "GetPremiumVC") as UIViewController, animated: true, completion: nil)

        default:
            break
        } 
    }

Вот как я отклоняю представление ограничителя и закрываю боковую панель при нажатии снаружи

class SideMenuViewController: UIViewController, UITableViewDelegate
{
    @IBOutlet weak var modalView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let view = modalView
        {
            addTapGesture(target: view, action: #selector(dismissController))
        }

    }

    @objc private func dismissController()
    {
        dismiss(animated: true, completion: nil)
    }

}
extension SideMenuViewController {
    func addTapGesture(target: UIView, action: Selector, numberOfTaps: Int = 1) {
        let tap = UITapGestureRecognizer(target: self, action: action)
        tap.numberOfTapsRequired = numberOfTaps
        target.isUserInteractionEnabled = true
        target.addGestureRecognizer(tap)
    }
}

Это раскадровка бокового меню

1 Ответ

2 голосов
/ 29 апреля 2020

Боюсь, что это ограничение в UIKit, View Controller может представить только один другой ViewController.

Так что, как я вижу, у вас есть два варианта: либо сначала отклонить уже представленный SideMenuViewController, либо сделать SideMenuViewController настоящим контроллер представления Adyen.

Если вы используете Adyen checkout SDK 3.5.0, к каждому экземпляру UIViewController, который получает самый верхний из представленных контроллеров представления, добавляется вспомогательное свойство, используйте это свойство MainViewController - или любого другого контроллера представления, который имеет смысл представить контроллер представления Adyen Checkout - для представления другого поверх него.

presenterViewController.adyen.topPresenter.present(secondPresentedVC, animated: true)

, если вы используете версию SDK, в котором этот помощник adyen отсутствует, вы можете реализовать расширение UIViewController следующим образом:

extension UIViewController {

    var topPresenter: UIViewController {
        var topController: UIViewController = self
        while let presenter = topController.presentedViewController {
            topController = presenter
        }
        return topController
    }

}

Надеюсь, это поможет!.

...