React Native 如何访问 iOS 词典来拉取词义?

kev*_*ndo 3 reactive-programming ios

看起来 Apple 的文档中有一些参考资料,但我在任何组件中都没有看到这一点(例如,在此处列出)。

因为这似乎是一个非常标准的功能,所以我觉得我只是缺少一些基本的东西。这也不是最容易搜索的东西。

这是 Apple 的 sdk 文档 https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIReferenceLibraryViewControllerClassRef/index.html

Art*_*tal 5

如您所知,为了能够使用本机代码,您需要创建本机模块。

就是这样..

首先在 Xcode 中添加一个新文件

文件 > 新建文件 > Cocoa Touch 类。确保将其设置为 NSObject 的子类。例如,将其命名为 ReferenceLibraryManager。

在头文件 (.h) 中:

您只需要实现RCTBridgeModule协议:

#import "RCTBridgeModule.h"

@interface ReferenceLibraryManager : NSObject <RCTBridgeModule>
@end
Run Code Online (Sandbox Code Playgroud)

在方法文件 (.m) 中:

您需要实现并公开一个可以从 JS 调用的本机方法,如下所示:

#import "ReferenceLibraryManager.h"
#import <UIKit/UIReferenceLibraryViewController.h>
#import "AppDelegate.h"

@implementation ReferenceLibraryManager

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(showDefinitionForTerm:(NSString*)term callback:(RCTResponseSenderBlock)callback)
{
  if (callback == nil)
    return;

  BOOL hasDefinition = NO;
  if ([UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:term])
  {
    hasDefinition = YES;

    dispatch_async(dispatch_get_main_queue(), ^{
      UIReferenceLibraryViewController *referenceLibraryVC = [[UIReferenceLibraryViewController alloc] initWithTerm:term];
      UIViewController *rootVC = ((AppDelegate*)[UIApplication sharedApplication].delegate).window.rootViewController;
      [rootVC presentViewController:referenceLibraryVC animated:YES completion:nil];
    });
  }

  callback(@[@(hasDefinition)]);
}

@end
Run Code Online (Sandbox Code Playgroud)

一些有趣的事情要注意:

  1. 为了能够像我们在这里所做的那样呈现“视图控制器”,您需要另一个视图控制器来呈现它。上面的代码使用应用程序的“根视图控制器”来做到这一点。它应该适用于大多数情况,但也取决于您的应用程序的结构。
  2. React Native 不会在主线程上调用原生组件方法。在处理与 UI 相关的任何事情时,您必须在主线程上进行,因此要使用dispatch_async主线程。

JavaScript 部分:

您导入本机模块并使用它..

var React = require('react-native');
var ReferenceLibraryManager = React.NativeModules.ReferenceLibraryManager;
....
var term = "React";
ReferenceLibraryManager.showDefinitionForTerm(term, (hasDefinition) => {

  if(!hasDefinition) {
    alert('definition not found...');
  }
})
Run Code Online (Sandbox Code Playgroud)

顺便说一句 - 您可以在react native docs上找到创建本机模块的完整指南和示例。