【问题标题】:Stripe Checkout iOS integration with Storyboards in Swift 3Stripe Checkout iOS 与 Swift 3 中的 Storyboard 集成
【发布时间】:2017-04-04 08:17:28
【问题描述】:

我正在关注 Swift 3 中的Stripe Standard iOS 集成“示例/简单”

但是,我正在使用情节提要,并且已将代码集成到目前运行良好的状态。但是在调用此代码时,我在导航堆栈上实例化 STPPaymentMethodsViewController 时遇到问题

来自 CheckoutRowView:

func didTap() {
    self.onTap()
}

紧随其后

var onTap: () -> () = {}

到 CheckoutViewController:

var paymentContext = STPPaymentContext()

let paymentRow: CheckoutRowView

viewDidLoad() {
self.paymentRow.onTap = { [weak self] _ in
        self?.paymentContext.pushPaymentMethodsViewController()
    }
}

每当我点击 paymentRow 时,什么都没有发生。它只是闪烁,就像一个没有动作的按钮。将 viewController 添加到情节提要场景需要一个标识符。这就说得通了!

但代码中没有标识符,因此在逻辑上添加一个会在运行时引发异常。不向情节提要场景添加 viewController 意味着没有 viewController 被压入堆栈。我错过了什么?

【问题讨论】:

    标签: ios storyboard swift3 segue stripe-payments


    【解决方案1】:

    除了简单地实例化它之外,您是如何设置您的 paymentContext 的?这是我自己的一些代码供参考:

    //custom class conforms to
    STPPaymentContextDelegate
    
    //class variable
    var paymentContext: STPPaymentContext!
    
    //in some function
    let paymentContext = STPPaymentContext(apiAdapter: StripeAPIClient.sharedClient, configuration: config, theme: theme)
    let userInformation = STPUserInformation()
    paymentContext.prefilledInformation = userInformation
    
    paymentContext.paymentAmount = 100
    paymentContext.paymentCurrency = "usd"
    
    self.paymentContext = paymentContext
    self.paymentContext.delegate = self
    paymentContext.hostViewController = self
    

    编辑:

    你有没有:

    paymentRow.configure(title: "Payment", detail: "Select Payment", theme: theme)
    

    configure 方法是将操作添加到行视图:

    func configure(title: String, detail: String, tappable: Bool = true, theme: STPTheme) {
    
        self.title = title
        self.detail = detail
    
        self.backgroundColor = theme.secondaryBackgroundColor
        self.backgroundView.addTarget(self, action: #selector(didTap), for: .touchUpInside)
        if !tappable {
            self.backgroundView.isUserInteractionEnabled = false
            self.backgroundColor = theme.primaryBackgroundColor
        }
        ...
        ...
    }
    

    来自文档:

    open func pushPaymentMethodsViewController()
    

    这会创建、配置 STPPaymentMethodsViewController 并将其适当地推送到上下文 hostViewController 的导航堆栈上。当用户选择完付款方式后,它会自动弹出。

    自定义付款行:

    忽略那个随机转场,它会转到一个不相关的控制器。

    【讨论】:

    • 就是这样。除了我的 BackendAPIAdapterMyAPIClient 而不是 StripeAPIClient 但这是一个细节。其他一切都是一样的。
    • 还是什么都没有。呃。
    • 嘿弗兰基。不工作。此外,视图控制器显然没有内置在该方法中。我正在使用故事板。如果不添加允许我进行转场的标识符,我就无法将情节提要添加到场景中。
    • 另外,除了我用 convenience init 代替 func configure 之外,我基本上有相同的代码,这同样无助于激活 paymentRow 或将新视图推入堆栈。
    • 我的项目有故事板,但我没有为付款方式控制器使用故事板,因此不需要 segue。我发布了文档定义。 pushPaymentMethodsViewController() 创建并推送新控制器。我的设置很简单,这意味着您的项目中可能还有其他事情正在阻止这种情况发生。对不起!
    【解决方案2】:

    我遇到了同样的问题,我通过使用 .presentPaymentMethodsViewController() 而不是 .pushPaymentMethodsViewController() 解决了它。 .pushShippingViewController() 同样适用,只需将其重命名为 presentShippingViewController()

    self.paymentRow.onTap = { [weak self] in
                self?.paymentContext.presentPaymentMethodsViewController()
            }
            self.shippingRow.onTap = { [weak self]  in
                self?.paymentContext.presentShippingViewController()
            }
    

    【讨论】:

      【解决方案3】:

      如果您检查pushPaymentOptionsViewController 的代码,hostViewController 需要是UINavigationController 或嵌入在UINavigationController

      - (void)pushPaymentOptionsViewController {
          NSCAssert(self.hostViewController != nil, @"hostViewController must not be nil on STPPaymentContext when calling pushPaymentOptionsViewController on it. Next time, set the hostViewController property first!");
          UINavigationController *navigationController;
          if ([self.hostViewController isKindOfClass:[UINavigationController class]]) {
              navigationController = (UINavigationController *)self.hostViewController;
          } else {
              navigationController = self.hostViewController.navigationController;
          }
          NSCAssert(self.hostViewController != nil, @"The payment context's hostViewController is not a navigation controller, or is not contained in one. Either make sure it is inside a navigation controller before calling pushPaymentOptionsViewController, or call presentPaymentOptionsViewController instead.");
          WEAK(self);
          [self.didAppearPromise voidOnSuccess:^{
              STRONG(self);
              if (self.state == STPPaymentContextStateNone) {
                  self.state = STPPaymentContextStateShowingRequestedViewController;
      
                  STPPaymentOptionsViewController *paymentOptionsViewController = [[STPPaymentOptionsViewController alloc] initWithPaymentContext:self];
                  self.paymentOptionsViewController = paymentOptionsViewController;
                  paymentOptionsViewController.prefilledInformation = self.prefilledInformation;
                  paymentOptionsViewController.paymentOptionsViewControllerFooterView = self.paymentOptionsViewControllerFooterView;
                  paymentOptionsViewController.addCardViewControllerFooterView = self.addCardViewControllerFooterView;
                  if (@available(iOS 11, *)) {
                      paymentOptionsViewController.navigationItem.largeTitleDisplayMode = self.largeTitleDisplayMode;
                  }
      
                  [navigationController pushViewController:paymentOptionsViewController
                                                  animated:[self transitionAnimationsEnabled]];
              }
          }];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 2019-04-14
        • 1970-01-01
        • 2015-01-05
        • 2017-02-16
        • 2021-12-21
        • 2017-12-14
        相关资源
        最近更新 更多