kev*_*ndo 3 reactive-programming ios
看起来 Apple 的文档中有一些参考资料,但我在任何组件中都没有看到这一点(例如,在此处列出)。
因为这似乎是一个非常标准的功能,所以我觉得我只是缺少一些基本的东西。这也不是最容易搜索的东西。
这是 Apple 的 sdk 文档 https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIReferenceLibraryViewControllerClassRef/index.html
如您所知,为了能够使用本机代码,您需要创建本机模块。
就是这样..
首先在 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)
一些有趣的事情要注意:
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上找到创建本机模块的完整指南和示例。
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |