得到"不是公认的Objective-C方法"将Swift桥接到React-Native时

时间:2016-09-25 21:56:13

标签: objective-c swift reactjs react-native

我试图将我的React-Native 0.33代码桥接到一个超级简单的Swift方法,跟随this guide,但我得到的只是show:(NSString *)name is not a recognized Objective-C method

这是我的代码:

SwitchManager.swift

import Foundation

@objc(SwitchManager)
class SwitchManager: NSObject {

  @objc func show(name: String) -> Void {
    NSLog("%@", name);
  }

}

SwitchManagerBridge.h

#import "RCTBridgeModule.h"

@interface RCT_EXTERN_MODULE(SwitchManager, NSObject)

RCT_EXTERN_METHOD(show:(NSString *)name)

@end

SwitchManager-桥接-Header.h

#import "RCTBridgeModule.h"

然后在我的index.ios.js文件中,我使用import { SwitchManager } from 'NativeModules';导入SwitchManager并调用SwitchManager.show('One');。这就是错误发生的地方。

不确定是什么错误。

4 个答案:

答案 0 :(得分:60)

这是Swift 3更改的一部分,可以通过添加下划线来解决:

import Foundation

@objc(SwitchManager)
class SwitchManager: NSObject {

  @objc func show(_ name: String) {
    NSLog("%@", name);
  }

}

请参阅“一致的第一个参数标签”下的0046 Proposal: Establish consistent label behavior across all parameters including first labels中调出的Swift 3的Swift.org migration guide

基本上,Objective-C如何看到Swift方法已经改变了Swift 3。

编辑:Swift 4中仍然如此,see docs here under Omitting Argument Labels

答案 1 :(得分:10)

这在xcode 8.0和swift 3

中对我有用
@objc func openPresentedViewController(_ name: String,name1: String,name2: String){
}

_添加到未标记的成员

RCT_EXTERN_METHOD(methodName:(NSString *)name name1:(NSString *)name1 name2:(NSString *)name2)

正如您在目标c中看到的方法名称是未标记的参数在swift方法中添加_

答案 2 :(得分:3)

我整天都在和这个问题作斗争。通过将Swift编译器设置为使用旧版本(XCode 8更喜欢Swift 3)来解决,所以在:

构建设置>向下滚动到' 使用旧版Swift语言版'设为

答案 3 :(得分:0)

我有同样的错误,因为我忘记在函数声明之前放置装饰器@objc