嗨,软件狂热者们,

我目前正在做一个React原生项目,我需要添加一些用swift编写的逻辑.通过连接到目标C,然后连接到swift,我能够触发基本的swift功能.

当我试图用promise 做某事时,问题就出现了.在我描述这一点的页面中,目标C部分明确了promise ,也明确了对Swift的衔接,但对Swift的promise :https://facebook.github.io/react-native/docs/native-modules-ios.html

这就是我所拥有的:

Project-Bridging-Header.h

#import <React/RCTBridgeModule.h>

MyLoginBridge.m

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_REMAP_MODULE(MyCustomLoginJSName, MyLoginModule, NSObject)

RCT_EXTERN_REMAP_METHOD(loginWithEmail,
                    resolver:(RCTPromiseResolveBlock)resolve
                    rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(testMethod)

@end

MyLoginModule.swift

import Foundation

@objc(TripleASDKModule)
class TripleASDKModule: NSObject {

  @objc
  func loginWithEmail(resolver resolve: RCTPromiseResolveBlock,  rejecter reject: RCTPromiseRejectBlock) -> Void {
    resolve("This method is troublesome")
  }

  @objc func testMethod() -> Void {
    print("This Does appear")
  }
}

当我触发testMethod时,打印显示在Xcode中,以便执行swift代码.但当我调用loginWithEmail方法时,我会看到臭名昭著的红色React原生错误屏幕,上面写着:

Exception 'resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject is not a recognized Objective-C method.' was thrown while invoking loginWithEmail on target MyCustomLoginJSName with params (
    30,
    31
)

为了完整起见,Javascript方面:

const loginWithEmail = () => NativeModules.TripleA.loginWithEmail()
    .then(result => console.log(result));

我try 了几乎所有我能找到的RCT_EXTERN_REMAP_METHOD和类似的变体,无论是否重新映射,重复名称,等等.

推荐答案

摘自Got "is not a recognized Objective-C method" when bridging Swift to React-Native分的答案;事实上,它不起作用,是因为第一个参数标签的不同.

要使其与初始代码配合使用,您应该将Swift的第一个参数写为不带名称,如下所示:

@objc
func loginWithEmail(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
    //   the trick  ^
    resolve("This method is no longer troublesome")
}

React-native相关问答推荐

如何在Recact Native中单击Back按钮后调用函数

如何根据设备主题更改React Native中状态栏的背景?

一旦我关闭应用程序,Json struct 就会发生变化

在 React Native 中打开后日期 Select 器不关闭

使用react native 杀死应用程序后蓝牙仍处于活动状态

React Native - 何时调用componentWillUnmount?

React Navigation v5 中的初始路由参数?

如何运行 React-Native 示例?

修复错误:路由 'Home' 的组件必须是 React 组件

如何判断 React Native 中的 AsyncStorage 中是否存在密钥? getItem() 总是返回一个promise对象

React-Native:FlatList onRefresh not called on pull up.

将 react-native 元素Bundle 为 iOS 框架或 (.aar) Android 库

等待模块失效的超时

按钮的标题属性必须是字符串

React Native:使用百分比时将视图的宽度设置为等于其高度

react-native:多色文本视图

Android Log

无法解析模块react-native-screen

在 react-native 中使用捏拉zoom 的可滚动图像

React Native:任务':app:transformDexArchiveWithExternalLibsDexMergerForDebug'的执行失败