React Native如何访问iOS字典以获取单词的定义?

时间:2015-11-18 04:06:44

标签: ios reactive-programming

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

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

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

3 个答案:

答案 0 :(得分:2)

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

这是怎么......

首先在Xcode中添加新文件

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

在标题文件(.h)中:

您只需要实施RCTBridgeModule协议:

#import "RCTBridgeModule.h"

@interface ReferenceLibraryManager : NSObject <RCTBridgeModule>
@end

在方法文件(.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

需要注意一些有趣的事情:

  1. 为了能够像我们在这里一样呈现​​“视图控制器”,您需要另一个视图 控制器来呈现它。上面的代码使用了 应用程序的“根视图控制器”。它应该适用于大多数人 案例,但它也取决于您的应用程序的结构。
  2. React native不会在主线程上调用本机组件方法。处理与UI相关的任何事情时,您必须在主线程上执行此操作,因此将dispatch_async用于主线程。
  3. JavaScript部分:

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

    var React = require('react-native');
    var ReferenceLibraryManager = React.NativeModules.ReferenceLibraryManager;
    ....
    var term = "React";
    ReferenceLibraryManager.showDefinitionForTerm(term, (hasDefinition) => {
    
      if(!hasDefinition) {
        alert('definition not found...');
      }
    })
    

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

答案 1 :(得分:0)

可能会帮助你

NSString *str =@"pretty";
// pass word as string in str which you want to search
if ([UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:str]) {
    UIReferenceLibraryViewController* ref =
    [[UIReferenceLibraryViewController alloc] initWithTerm:str];
    [self presentViewController:ref animated:YES completion:nil];
}
else
{
    // do something when no definition found
}

答案 2 :(得分:0)

适用于仍需要此功能的任何人。我为此写了npm package(谢谢Artal)。

下面是一个快速演示。

a simple demo