2

i'm facing a problem, i'm using a tableview as sidebar to present certain controller from the app. When trying to preset Adyen checkout for payment getting an error that tells me i cannot use multi presenting, my question is, how can i fix this issue?

I was thinking to dismiss the sidebar after the button for checkout is pressed or to push the side bar and present the other controllers, but with no success or i didn't do it right.

Thank you!

This is the side menu button placed in 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)
    } 

Presenting each index from the tabel

 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
        } 
    }

This is how i dismiss the contrainer view and close the sidebar when tapped outside

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)
    }
}

This is the side menu storyboard

Community
  • 1
  • 1

1 Answers1

2

I am afraid that's a limitation in UIKit, a View Controller can present only one other ViewController.

So how I see it, you have two choices, either dismiss the already presented SideMenuViewController first, or make the SideMenuViewController present the Adyen view controller.

If you are using Adyen checkout SDK 3.5.0, there is a helper property added to every instance of a UIViewController that gets the top most presented view controller, use this property of the MainViewController -or any other view controller that would make sense to present the adyen checkout view controller- to present another one on top of it.

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

if you're using a version of the SDK in which this adyen helper is not present, you can implement an extension of UIViewController as follows:

extension UIViewController {

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

}

Hope this helps!.

m.eldehairy
  • 679
  • 8
  • 9
  • Thx for your time and answer, due the fact that i was wasting time on that problem, i gave up and used a colection view instead of table view and also gave up on storyboards, wrote it in MainViewControler, with that i could push some VC instead of presenting including the one with adyen, the only problem i have left is to figure it out how can I get some values from inside a func, inside AppDelegate and pass it to main view controller – Vladut Chisu Apr 29 '20 at 11:04