【问题标题】:How to present Adyen checkout if i'm already presenting a controller?如果我已经在展示控制器,如何展示 Adyen 结帐?
【发布时间】:2020-08-09 04:55:16
【问题描述】:

我遇到了一个问题,我使用 tableview 作为侧边栏来展示应用程序中的某些控制器。当尝试为付款预设 Adyen 结帐时,出现一个错误,告诉我我不能使用多重呈现,我的问题是,我该如何解决这个问题?

我想在按下结帐按钮后关闭侧边栏,或者按下侧边栏并展示其他控制器,但没有成功,或者我做得不对。

谢谢!

这是放在 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)
    }
}

This is the side menu storyboard

【问题讨论】:

    标签: ios swift storyboard uikit adyen


    【解决方案1】:

    恐怕这是 UIKit 的一个限制,一个 View Controller 只能呈现另一个 ViewController。

    所以我怎么看,你有两个选择,要么首先关闭已经呈现的 SideMenuViewController,要么让 SideMenuViewController 呈现 Adyen 视图控制器。

    如果您使用的是 Adyen checkout SDK 3.5.0,则会向 UIViewController 的每个实例添加一个辅助属性,该属性会获取最顶部的视图控制器,请使用 MainViewController 的此属性 - 或任何其他视图控制器显示 adyen 结帐视图控制器是有意义的 - 在它之上显示另一个。

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

    希望这会有所帮助!

    【讨论】:

    • 感谢您的时间和回答,由于我在那个问题上浪费时间,我放弃并使用集合视图而不是表格视图,也放弃了故事板,在 MainViewControler 中编写,这样我可以推送一些 VC 而不是呈现包括带有 adyen 的 VC,我剩下的唯一问题是弄清楚如何从 func 内部、AppDelegate 内部获取一些值并将其传递给主视图控制器跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2015-12-11
    • 2023-02-07
    相关资源
    最近更新 更多