Got “is not a recognized Objective-C method” when bridging Swift to React-Native

匿名 (未验证) 提交于 2019-12-03 03:04:01

问题:

I'm trying to bridge my React-Native 0.33 code to a super simple Swift method, following this guide but all I'm getting is show:(NSString *)name is not a recognized Objective-C method.

Here's my code:

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-Bridging-Header.h

#import "RCTBridgeModule.h" 

Then on my index.ios.js file I'm importing SwitchManager with import { SwitchManager } from 'NativeModules'; and calling SwitchManager.show('One');. This is where the error happened.

Not sure what's wrong.

回答1:

I was fighting with this issue all day. Resolved by setting the Swift Compiler to use Legacy versions (XCode 8 is prefers Swift 3), so in:

Build Settings > Scroll down to 'Use Legacy Swift Language Version' set as Yes.



回答2:

This is a part of Swift 3's changes and can be solved by adding an underscore:

import Foundation  @objc(SwitchManager) class SwitchManager: NSObject {    @objc func show(_ name: String) {     NSLog("%@", name);   }  } 

See Swift 3's 0046 Proposal: Establish consistent label behavior across all parameters including first labels that is called out in the Swift.org migration guide under "Consistent first argument labels".

Basically, how Objective-C sees Swift methods has changed with Swift 3.

EDIT: This is still the case in Swift 4, see docs here under Omitting Argument Labels.



回答3:

this worked for me in xcode 8.0 and swift 3

@objc func openPresentedViewController(_ name: String,name1: String,name2: String){ } 

add _ to non labelled members

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

as you can see in the objective c method name is nonlabeled parameter add _ to it in the swift method



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!