看起来Apple的文档中有一些参考,但我没有在任何组件中看到这一点(例如在此处列出)。
因为这似乎是一个非常标准的功能,我觉得我只是缺少一些基本的东西。这也不是最容易搜索的东西。
答案 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
需要注意一些有趣的事情:
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...');
}
})
顺便说一下 - 您可以在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)