先不多說,先把原生的OC控件代碼標出了
#import <UIKit/UIKit.h>
#import <React/RCTViewManager.h>
NS_ASSUME_NONNULL_BEGIN
@interface IOSWebView : RCTViewManager
@end
NS_ASSUME_NONNULL_END
#import "IOSWebView.h"
#import <WebKit/WebKit.h>
//iOS調(diào)用RN
#import <React/RCTEventDispatcher.h>
#import <React/RCTUIManager.h>
@interface IOSWebView ()
@property (nonatomic ,strong) WKWebView *webView;
@end
@implementation IOSWebView
RCT_EXPORT_MODULE();
- (UIView *)view
{
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
webView.allowsBackForwardNavigationGestures = YES;
self.webView = webView;
return webView;
}
//reactTag是當前控件的tag值,不需要去管,releaseVLC是方法名,后面的one才是第一個參數(shù),如果有幾個參數(shù),可以在后面繼續(xù)添加
RCT_EXPORT_METHOD(releaseVLC:(nonnull NSNumber *)reactTag one:(NSString *)oneParam) {
NSLog(@"reactTag = %@ secondParam = %@",reactTag,secondParam);
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager * uiManager,NSDictionary *viewRegistry) {
WKWebView *view = viewRegistry[reactTag];
if (![view isKindOfClass:[WKWebView class]]) {
RCTLogError(@"Invalid view returned from registry, expecting WKWebView, got: %@", view);
} else {
dispatch_async(dispatch_get_main_queue(), ^{
// WKWebView * bannerView = (WKWebView *)viewRegistry[reactTag];
});
}
}];
}
@end
下面的是RN的js代碼調(diào)用IOS的原生方法
import React, { Component } from 'react';
import { StyleSheet, Text, View, TouchableOpacity, requireNativeComponent, UIManager, findNodeHandle } from 'react-native';
//IOSWebView這個是原生控件的Class名稱,h5rn這是當前rn頁面
var UIWebView = requireNativeComponent('IOSWebView', h5rn) ;
export default class h5rn extends Component<{}> {
constructor(props) {
super(props);
this.state = {
};
}
_back() {
UIManager.dispatchViewManagerCommand(
//this.refs["uiwebview"]這是當前UIWebView在頁面上的屬性,可以按自己想法隨便寫
findNodeHandle(this.refs["uiwebview"]),
//IOSWebView是原生控件的Class名稱,releaseVLC是原生的方法名
UIManager.getViewManagerConfig('IOSWebView').Commands.releaseVLC,
//這個地方很重要,這個地方是入?yún)?,如果iOS原生沒有參數(shù),你傳null,若有,這個地方必須是數(shù)組,參數(shù)放在數(shù)組中,數(shù)組的長度就是原生方法的參數(shù)個數(shù),謹記
["2"]
);
}
render() {
return (
<View style={{ flex: 1 }}>
<View style={{ flex: 1 }}>
<UIWebView ref={"uiwebview"} style={styles.IOSStyle} />
<TouchableOpacity style={{ with: gScreen.screen_width, height: 45 }} onPress={() => { this._back() }}>
<Text>返回</Text>
</TouchableOpacity>
</View>
</View>
);
}
}
var styles = StyleSheet.create({
webview_style: {
IOSStyle: {
width: 300,
height: 400,
}
});
如有不對,請大家指教,謝謝大家