在 SDK 中实现自定义取消按钮

Posted

技术标签:

【中文标题】在 SDK 中实现自定义取消按钮【英文标题】:Implement custom Cancel Button in a SDK 【发布时间】:2015-11-09 17:24:08 【问题描述】:

我想用paysbuy SDK实现支付功能....问题是它没有任何cancel选项,以便用户可以在支付成功后取消关闭操作。

默认情况下,SDK 提供了一种打开默认WebView 的方法,覆盖了整个屏幕。并且没有任何cancel 选项。

我只想通过在特定的view..或viewcontroller上加载付款来添加一个cancel按钮。我尝试在container视图中使用..加载container中的视图查看和container 视图外的cancel 按钮,但是当我尝试此过程时,它默认以全屏显示WebView。还尝试创建PopUP 但没有成功

那么,我如何将SDKwebview 加载到我的view 的特定部分,以便我可以放置一个Cancel 按钮??

这是sdk提供的启动服务的方法

- (void) callServiceWithCurrentView :(UIViewController *) currentViewController
                             invoice:(NSString *)invoice
                                item:(NSString *)item
                              amount:(NSString *)amount
                       paypal_amount:(NSString *)paypal_amount
                      transferMethod:(NSString *)transferMethod
                    customerLanguage:(NSString *)customerLanguage
                       operator_name:(NSString *)operator_name
                      operator_email:(NSString *)operator_email
                     operator_mobile:(NSString *)operator_mobile
                    operator_address:(NSString *)operator_address
                     operator_detail:(NSString *)operator_detail;

在这里我们可以看到callServiceWithCurrentView 方法将目标显示为currentviewcontroller,所以我认为它在viewcontroller 上默认以full screen 模式加载....

这是我在 swift 中的实现方式

   paysBuy?.callServiceWithCurrentView(self, invoice: "343434343", item: "App Fee", amount: "10", paypal_amount: "1", transferMethod: "1", customerLanguage: "E", operator_name: "PAYSBUY", operator_email: "abc@paysbuy.com", operator_mobile: "0888888888", operator_address: "PAYSBUY.COM", operator_detail: "PAYMENT")

还有一个委托方法,在成功或失败的情况下处理响应

extension PaysBuyHelper:PaysbuySDKDelegate
    func responseWithResult(result: String!, andInvoice invoice: String!) 

        //here is the response of the payement

        println(result)
        println(invoice)

        if result == "00" 

            println("transaction complete and below is the invoice number")
            println(invoice)

        else if result == "90"

            println("transaction incomplete information")

        

    


这是我所做的工作......https://drive.google.com/file/d/0Bzk4QVQhnqKmVno5NGdPUV9ITkE/view?usp=sharing

【问题讨论】:

您无法在 webview 上添加取消按钮,因为您无法控制它,我认为解决此问题的一个解决方案是您必须在函数并尝试将第二个 UIViewController 设为高度较小或类似的弹出窗口 @VarunNaharia 问题似乎是正在使用的 SDK 替换了根控制器。因此,当它接管时,无法控制屏幕上的内容。 @VarunNaharia 我试着按照你说的做,但效果不好......它显示我默认全屏......尝试在弹出窗口,容器视图上使用,正如 rory 在答案中所说......但是它们都不起作用 试试这个***.com/questions/17758420/… 并尝试在每个视图顶部制作一个按钮 我已经尝试过使用容器视图... 【参考方案1】:

模态控制器在控制器的框架上下文中呈现,该控制器被认为定义了呈现上下文。

您可以选择让调用callServiceWithCurrentView 的控制器为任何模态演示定义上下文,然后可以使用该上下文来限制屏幕上使用的区域。

您可以在 XCode 中通过单击呈现控制器并选择“定义上下文”复选框来执行此操作。在代码中,您可以将definesPresentationContext 设置为 TRUE。

为了对您有用,您需要呈现控制器的框架不是全屏的。理想的情况是这是 UINavigationController 中的控制器。

选项:

1) 您的展示控制器位于带有导航栏的导航控制器内。实际上它是一个子控制器。它使用的屏幕占用空间取决于它是否位于顶部和底部栏下方。 a) 设置您的控制器,使内容不会位于顶部栏下方。这有效地使导航栏下的框架。 b) 当您调用callServiceWithCurrentView 时,在导航栏上添加一个取消按钮。 c) 如果您将控制器设置为正确定义演示上下文,则 UIWebView 应显示在导航栏下方,您可以看到新的取消按钮。

2) 如果不在导航控制器中,那么不要直接调用该方法,而是在您放置取消按钮的子视图中添加一个子控制器。让这个子控制器拨打电话callServiceWithCurrentView。按照相同的机制,让这个子控制器定义上下文。任何模态 UIWebView 都应该只覆盖子控制器的区域。

希望这能给你一些选择。

【讨论】:

我尝试了第一种方法但不起作用drive.google.com/file/d/0Bzk4QVQhnqKmb04wTTVsT3ZOQUU/… @copeME 我也为您尝试了选项 2,但没有任何乐趣。更深入地看,paysbuy SDK 似乎没有以模态方式呈现,而是似乎完全取代了根控制器。这就是画面变化很快的原因。此外,如果您使用 3D 视图层次结构工具查看,原始控制器不在其后面。遗憾的是,我认为这意味着除了联系 SDK 作者之外,您无能为力。奇怪的是,他们会创建一个 SDK 来移除演示者的所有控制权。看来唯一的退路就是支付 8^)。 是的,我尝试了 3d 视图,但没有看到层次结构....即使用户支付成功,我认为视图不会被驳回..??? @copeME 是的,似乎坏了。您从哪里获得 SDK 代码?我在网上找不到。您需要 callServiceWithCurrentView 的代码或作者的修复。 我给 paysbuy 写了一封电子邮件,他们给我发了 sdk...我也写了一封电子邮件,告诉我如何计算取消选项,但没有回复...

以上是关于在 SDK 中实现自定义取消按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在Canvas中实现自定义路径动画

如何在自定义 Spring 存储库中实现自定义方法? [复制]

为啥不推荐使用 JScript 在 WiX 中实现自定义操作?

在具有条件的 keras 中实现自定义损失函数

在 Freemarker 中实现自定义 Escaper

如何在黄瓜中实现自定义监听器?