React Native調(diào)用IOS原生控件的方法,非繼承NSObject的控件

先不多說,先把原生的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,
  }
});

如有不對,請大家指教,謝謝大家

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容