【问题标题】:Got "is not a recognized Objective-C method" when bridging Swift to React-Native将 Swift 桥接到 React-Native 时得到“不是公认的 Objective-C 方法”
【发布时间】:2016-09-25 21:56:12
【问题描述】:

我正在尝试将我的 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-Bridging-Header.h

#import "RCTBridgeModule.h"

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

不知道怎么回事。

【问题讨论】:

  • import { NativeModules } from 'react-native'; var SwitchManager = NativeModules.SwitchManager; 怎么样?
  • @VojtaNovak 我想我也试过这个,但没用。我知道 SwitchManager.show 已定义,因为我做了一个 console.dir 并且它已暴露。
  • @VojtaNovak 刚试过,一样。

标签: objective-c swift reactjs react-native


【解决方案1】:

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

import Foundation

@objc(SwitchManager)
class SwitchManager: NSObject {

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

}

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

基本上,随着 Swift 3,Objective-C 对 Swift 方法的看法发生了变化。

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

【讨论】:

  • 这是为我做的。我可以确认这适用于 Swift 3 和 React Native 0.34.0-rc.0。
  • 对此的另一个注意事项:我的方法有 3 个参数,因此我为每个参数添加了下划线。这没有用!您必须将其添加到 only 未标记的参数
  • 是的,如果您查看文档,主要目标是保持与 Obj-C 库的兼容性。随着时间的推移,Apple 很可能会尝试完全淘汰这一点——事实上,只有 swift 的功能不需要这种下划线行为。它出现在这里的原因是 React Native 都是 Obj-C。
  • 太棒了!那个奇怪的下划线是怎么回事?有人能解释一下吗?
  • tnx,它有效。在 Swift4 和 xcode 9.4.1 中仍然是这样
【解决方案2】:

这在 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 方法中添加 _

【讨论】:

  • 也为 Swift 5 工作过。
  • 对我来说没有用。我需要将@objc 声明修改为@objc(openPresentedViewController: name1: name2:)
【解决方案3】:

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

构建设置 > 向下滚动到“Use Legacy Swift Language Version”设置为Yes

【讨论】:

  • 这是否意味着您不能使用 Swift 3?我也遇到了这个问题,但如果可能的话,我想使用 Swift 3。
  • @mike-cole 看看下面。如果您遇到了麻烦,请查看下划线是否有所作为,因为这是 Swift 3 中为了与 ObjC 方法兼容而做出的更改。这不是每个人问题的原因(我来到这里是因为另一个“不是公认的 Objective-C 方法”问题),但我猜这是一个常见的问题。
  • 这不应该是公认的答案,这只是一种解决方法。下面关于方法标签的解决方案是问题的实际解决方案。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2020-02-07
    相关资源
    最近更新 更多