【问题标题】:NativeScript Passing UIViewController to native iOS methodNativeScript 将 UIViewController 传递给原生 iOS 方法
【发布时间】:2019-03-16 22:14:00
【问题描述】:

我正在尝试按照 nativescript 插件种子(iOS 指令 https://docs.connect.squareup.com/payments/readersdk/setup-ios)为 Square Reader 创建一个新插件。最后一步是传入一个UIViewController 对象,以便它可以在您的应用程序中显示结帐页面。尝试传递所需参数时,我一直收到如下错误:

-[SquareReader checkoutController:didFailWithError:]: 无法识别的选择器发送到实例 0x10aa5c960 * JavaScript 调用栈: ( 0 UIApplicationMain@[本机代码] 1 start@file:///app/tns_modules/tns-core-modules/application/application.js:272:26 2 匿名@file:///app/app.js:4:18 3 评估@[本机代码] 4 模块评估@:1:11 5 @:7:48 6 promiseReactionJob@:1:11 ) * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[SquareReader checkoutController:didFailWithError:]:无法识别的选择器发送到实例 0x10aa5c960” *** 首先抛出调用堆栈: (0x185676d8c 0x1848305ec 0x185684098 0x18567c5c8 0x18556241c 0x1019b21f4 0x184f68aa0 0x184f68a60 0x184f7565c 0x18561f070 0x18561cbc8 0x18553cda8 0x187522020 0x18f55c758 0x101640044 0x10163e7a4 0x10163e26c 0x100cf5630 0x1012f0e14 0x1012f9a24 0x1012f9a34 0x1012f2ee0 0x10128c198 0x101261e94 0x1013f6b9c 0x100d0a354 0x101492964 0x1012fa494 0x1012f9a34 0x1012f9a34 0x1012f9a34 0x1012f2ee0 0x10128c198 0x101261e94 0x1013f6c80 0x10148e8e0 0x100d01898 0x100d47f50 0x10079629c 0x184fcdfc0) P>

我正在尝试在我的演示应用中实现 UIViewController

导出类 HelloWorldModel 扩展 UIViewController { ... }

错误来自以下几行:

let checkoutController = new SQRDCheckoutController({parameters: params, delegate: this }); checkoutController.presentFromViewController(view);

其中this 是我创建的具有checkoutControllerDidFailWithError 功能的SquareReader 类对象(我需要实现SQRDCheckoutControllerDelegate),viewHelloWorldModel 类的实例化。

我没有看到将 UIViewControllers 传递给 {N} 中的原生 iOS 方法的任何内容,但我找到了 https://discourse.nativescript.org/t/example-of-extending-uiviewcontroller-in-angular-2-and-nativescript/469 哪个可能相似?

【问题讨论】:

    标签: ios uiviewcontroller nativescript nativescript-plugin square-reader


    【解决方案1】:

    请参考Objective C to JS docs了解调用原生api的正确方法。

    假设SQRDCheckoutController 是控制器,使用参数初始化它的正确方法是

    SQRDCheckoutController.initWithParametersDelegate(params, delegate)
    

    如果你使用 TypeScript,generate declaration 文件,那么你可能很容易理解调用可用的原生 api 方法的 JS 形式是什么。

    您可以参考 tns 核心模块以获取 UIViewController 实现的示例。如果你有打算把这个插件开源,欢迎把它上传到 GitHub,让社区的插件大师们可以轻松地帮助你。

    【讨论】:

    • 这里是 repo:github.com/fhackenb/nativescript-square-reader 我尝试了你提供的那行代码,它以同样的错误结束。现在我在想我现在遇到的错误与我的委托实现有关,因为它没有找到我的 didFailWithError 方法
    • 您必须在SquareReader 类上使用@ObjCClass(SQRDCheckoutControllerDelegate) 装饰器,以便运行时理解并映射本机委托方法。还将声明移动到单独的类型文件中,以便阅读实际代码。
    • 原始库很快,所以不确定这是否有区别。当我添加该行时,我收到此错误:error TS2693: 'SQRDCheckoutControllerDelegate' only refers to a type, but is being used as a value here,当我将其更改为 @ObjCClass(SQRDCheckoutController) 或只是 @ObjCClass() 时,我收到 JS ERROR ReferenceError: Can't find variable: __metadata
    • 我只是推他们,谢谢!抱歉,我还没有将打字移出 - 但我确实弄清楚了为什么 @ObjCClass(SQRDCheckoutControllerDelegate) 会抛出错误。虽然仍然遇到 __metadata 问题
    • @Frank 请清理你的 repo 并确保它至少在没有 tslint 问题的情况下运行。您保存的越干净,其他人就可以快速浏览。另外,当您可以简单地获取内置视图控制器并显示您的结帐控制器时,我不明白为什么必须覆盖应用程序委托。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多