我试图将我的React-Native 0.33代码桥接到一个超级简单的Swift方法,跟随this guide,但我得到的只是show:(NSString *)name is not a recognized Objective-C method
。
这是我的代码:
import Foundation
@objc(SwitchManager)
class SwitchManager: NSObject {
@objc func show(name: String) -> Void {
NSLog("%@", name);
}
}
#import "RCTBridgeModule.h"
@interface RCT_EXTERN_MODULE(SwitchManager, NSObject)
RCT_EXTERN_METHOD(show:(NSString *)name)
@end
#import "RCTBridgeModule.h"
然后在我的index.ios.js
文件中,我使用import { SwitchManager } from 'NativeModules';
导入SwitchManager并调用SwitchManager.show('One');
。这就是错误发生的地方。
不确定是什么错误。
答案 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