React Native原生UI封裝以及事件處理

對(duì)于目前的移動(dòng)端原生開發(fā)來說若未,想要完成一個(gè)app的開發(fā)工作是比較容易的,因?yàn)樵a在網(wǎng)上所提供出來的各種開源的第三方組件已經(jīng)成千上萬了,足以支撐起你的業(yè)務(wù)需求羊初。但是如果我們想要在React Native上使用第三方組件怎么辦街立?
眾所周知舶衬,React Native自身框架也提供了一部分基礎(chǔ)組件,已經(jīng)可以基本滿足我們的開發(fā)需求赎离,但是逛犹,當(dāng)我們需要使用第三方接口的時(shí)候該如何?目前市面上基本所有的第三方組件接口都還不提供對(duì)React Native的支持梁剔,所以虽画,需要使用第三方的時(shí)候,還得我們自己來封裝處理荣病。
接下來码撰,我們一步一步來封裝友盟分享的組件绘证。

1瘩欺、首先導(dǎo)入友盟分享SDK,然后添加相關(guān)的底層依賴文件:
0_1473132391960_屏幕快照 2016-09-06 上午9.05.37.png

底層依賴庫的添加:項(xiàng)目 --> build phases --> link binary with libraries在link binary with libraries中點(diǎn)加號(hào)近上,添加上圖中的依賴文件砾省,如下圖所示鸡岗。

2、 添加好依賴文件之后编兄,我們接下來完成在原生中的那部分代碼轩性。(1) 在AppDelegate中的application:didFinishLaunchingWithOptions: 方法中設(shè)置友盟AppKey:

// 設(shè)置友盟AppKey[UMSocialData setAppKey:@"57355f3e67e58ed0a50030a1"];

(2) 寫一個(gè)分享按鈕類,繼承于UIButton狠鸳,然后在其中引入友盟分享頭文件UMSocial.h揣苏,接下來就可以寫按鈕觸發(fā)的分享事件了。

#import "MyShareBt.h"
#import "UMSocial.h"

@implementation MyShareBt
//分享按鈕初始化
- (instancetype) initWithFrame:(CGRect)frame{
  if ((self = [super initWithFrame:frame])) {
    [self addTarget:self action:@selector(share)
   forControlEvents:UIControlEventTouchUpInside];
  }
  return self;
}

// 按鈕分享事件
- (void)share {
  [UMSocialSnsService presentSnsIconSheetView:[UIApplication sharedApplication].keyWindow.rootViewController appKey:@”yourAppKey” shareText:@”test” shareImage:[UIImage imageNamed:@”yourImageName”] shareToSnsNames:[NSArray arrayWithObjects:UMShareToWechatSession,UMShareToWechatTimeline,UMShareToQzone,UMShareToSina,UMShareToTencent,nil]  delegate:nil];
}

@end

(3)穿件分享組件Manager類件舵,該類繼承于RCTViewManager卸察。創(chuàng)建好之后,添加標(biāo)記宏RCT_EXPORT_MODULE()將改模塊導(dǎo)出作為一個(gè)組件铅祸。最后實(shí)現(xiàn)-(UIView *)view方法坑质。代碼如下:

#import "shareButtonManager.h"
#import "RCTViewManager.h"
#import "UMSocial.h"
#import "MyShareBt.h"

@interface shareBt : RCTViewManager

@property (nonatomic) MyShareBt *bt;

@end

@implementation shareBt

RCT_EXPORT_MODULE()

- (UIView *)view
{
  _bt = [[MyShareBt alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
  return _bt;
}

@end

至此合武,原生部分代碼最基本的展示部分完成了,接下來就需要在JS中進(jìn)行進(jìn)一步封裝涡扼,以提供給JS調(diào)用稼跳。

3、接下來實(shí)現(xiàn)JS中的組件封裝與簡單調(diào)用吃沪。

首先導(dǎo)入原生組件汤善,從導(dǎo)入中取得我們所創(chuàng)建的組件,將其作為默認(rèn)的組件導(dǎo)出票彪,以供其他JS調(diào)用红淡。這里,我們其實(shí)可以直接在其他JS中調(diào)用了降铸,但是為了進(jìn)行參數(shù)的封裝在旱,我們也需要將其封裝成一個(gè)單獨(dú)的組件。

import React, { Component, PropTypes } from 'react';
import { requireNativeComponent} from 'react-native';

var ShareBt = requireNativeComponent('shareBt', ZKShareBt);

export default class ZKShareBt extends Component {
  render() {
    return (
      <ShareBt {...this.props} />
    );
  }
}

封裝組件的調(diào)用推掸。下圖所示是前面封裝組件的調(diào)用颈渊,這里我們已經(jīng)封裝了很多JS需要傳遞給原生的參數(shù),接下來终佛,我們就來說說參數(shù)以及事件處理的封裝俊嗽。

<ZKShareBt style={styles.map}
            appKey={'57355f3e67e58ed0a50030a1'}
            shareText={'這是分享內(nèi)容'}
            imageName={'logo'}
            //myTitle = {this.state.btText}//設(shè)置分享按鈕標(biāo)題
            //color={this.state.color}//設(shè)置分享按鈕標(biāo)題字體顏色
            btImageName = {'share_icon'} //設(shè)置分享按鈕圖片
   />
4、參數(shù)的封裝

(1) 定義需要傳遞的參數(shù)

#import <UIKit/UIKit.h>

@interface MyShareBt : UIButton

@property (nonatomic, copy) NSString * appKey;//友盟appkey
@property (nonatomic, copy) NSString * shareText;//分享的文本
@property (nonatomic, copy) NSString * imageName;//分享的圖片
@property (nonatomic, copy) NSString * myTitle;//分享按鈕標(biāo)題
@property (nonatomic) UIColor * color;//按鈕標(biāo)題字體顏色
@property (nonatomic, copy) NSString * btImageName;//分享按鈕圖片

@end

(2)以上參數(shù)是我們需要從JS傳遞給原生的铃彰,所以我們首先在原生代碼中定義好所需要的參數(shù)绍豁。定義好之后,我們需要使用RCT_EXPORT_VIEW_PROPERTY宏將其導(dǎo)出給JS牙捉。

#import "shareButtonManager.h"
#import "RCTViewManager.h"
#import "UMSocial.h"
#import "MyShareBt.h"

@interface shareBt : RCTViewManager

@property (nonatomic) MyShareBt *bt;

@end

@implementation shareBt

RCT_EXPORT_MODULE()

- (UIView *)view
{
  _bt = [[MyShareBt alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
  return _bt;
}
//將所需參數(shù)導(dǎo)出給JS
RCT_EXPORT_VIEW_PROPERTY(appKey, NSString)
RCT_EXPORT_VIEW_PROPERTY(shareText, NSString)
RCT_EXPORT_VIEW_PROPERTY(imageName, NSString)
RCT_EXPORT_VIEW_PROPERTY(myTitle, NSString)
RCT_EXPORT_VIEW_PROPERTY(color, UIColor)
RCT_EXPORT_VIEW_PROPERTY(btImageName, NSString)

@end

(3)重寫參數(shù)set方法竹揍,并給按鈕屬性賦值,設(shè)置UI邪铲。

#import "MyShareBt.h"
#import "UMSocial.h"

@implementation MyShareBt

- (instancetype) initWithFrame:(CGRect)frame{
  if ((self = [super initWithFrame:frame])) {
    [self addTarget:self action:@selector(share)
   forControlEvents:UIControlEventTouchUpInside];
  }
  return self;
}
//重寫所傳遞參數(shù)的set方法芬位,并將傳遞過來的參數(shù)用于設(shè)置UI
- (void)setMyTitle:(NSString *)myTitle{
  [self setTitle:myTitle forState:UIControlStateNormal];
}

- (void)setColor:(UIColor *)color{
  [self setTitleColor:color forState:UIControlStateNormal];
}

- (void)setBtImageName:(NSString *)btImageName{
  [self setBackgroundImage:[UIImage imageNamed:btImageName] forState:UIControlStateNormal];
}

- (void)share {
  [UMSocialSnsService presentSnsIconSheetView:[UIApplication sharedApplication].keyWindow.rootViewController appKey:_appKey shareText:_shareText shareImage:[UIImage imageNamed:_imageName] shareToSnsNames:[NSArray arrayWithObjects:UMShareToWechatSession,UMShareToWechatTimeline,UMShareToQzone,UMShareToSina,UMShareToTencent,nil]  delegate:nil];
}

@end

(4)在JS中將參數(shù)封裝起來。

import React, { Component, PropTypes } from 'react';
import { requireNativeComponent} from 'react-native';

var ShareBt = requireNativeComponent('shareBt', ZKShareBt);

export default class ZKShareBt extends Component {
  static propTypes = {
    /**
    *
    * 定義組件需要傳到原生端的屬性
    * 使用React.PropTypes來進(jìn)行校驗(yàn)
    */
    //使用第三方分享時(shí)設(shè)置的appKey
    appKey:PropTypes.string,

    //要分享的內(nèi)容
    shareText:PropTypes.string,

    //需要分享的圖片名字(需要事先放在xcode工程中带到,只需要名字昧碉,不需要路徑)
    imageName:PropTypes.string,

    //分享按鈕標(biāo)題
    myTitle:PropTypes.string,

    //分享按鈕標(biāo)題顏色
    color:PropTypes.string,

    //分享按鈕圖片
    btImageName:PropTypes.string,
  };
  render() {
    return (
      <ShareBt {...this.props} />
    );
  }
}

封裝好之后,就可以直接調(diào)用了揽惹。

<ZKShareBt style={styles.map}
            appKey={'57355f3e67e58ed0a50030a1'}
            shareText={'分享內(nèi)容'}
            imageName={'logo'}
            //myTitle = {this.state.btText}//設(shè)置分享按鈕標(biāo)題
            //color={this.state.color}//設(shè)置分享按鈕標(biāo)題字體顏色
            btImageName = {'share_icon'} //設(shè)置分享按鈕圖片
   />

運(yùn)行結(jié)果:


0_1473329073169_Simulator Screen Shot 2016年9月6日 上午10.22.29.png
(第一張圖中被饿,一不小心封裝了其他App中的視圖,這里可以通過fetch請求網(wǎng)絡(luò)數(shù)據(jù)搪搏,獲取流量之后傳給原生并根據(jù)值的變化動(dòng)態(tài)顯示流量所占百分比狭握。請自動(dòng)忽略。疯溺。论颅。哎垦。。恃疯。)
以上是涉及到UI以及相關(guān)參數(shù)傳遞的封裝工作撼泛,接下來,需要做的是事件的封裝澡谭。這里事件封裝用到的是RCTBubblingEventBlock宏。封裝事件是损俭,首先蛙奖,我們需要首先在原生中先定義好需要在JS調(diào)用的方法模塊。和之前參數(shù)定義一樣杆兵,放在原生UI模塊.h文件中

MyShareBt.h
/** button點(diǎn)擊事件*/
@property (nonatomic, copy) RCTBubblingEventBlock onButtonClicked;

和參數(shù)一樣雁仲,接下來需要導(dǎo)出:

shareButtonManager.m
RCT_EXPORT_VIEW_PROPERTY(onButtonClicked, RCTBubblingEventBlock)

導(dǎo)出之后,這里我就簡單的定義一個(gè)分享按鈕點(diǎn)擊時(shí)觸發(fā)的Delegate方法

MyShareBt.h
@protocol ShareButtonClickedDelegate <NSObject>
@optional
//代理方法
- (void)ButtonClicked;
@end
@property (nonatomic, strong) id <ShareButtonClickedDelegate> ClickDelagate;

該代理方法在按鈕點(diǎn)擊分享的時(shí)候執(zhí)行:

MyShareBt.m
- (void)share {
  //調(diào)用代理方法
  [self.ClickDelagate ButtonClicked];
  //友盟分享
  [UMSocialSnsService presentSnsIconSheetView:[UIApplication sharedApplication].keyWindow.rootViewController appKey:_appKey shareText:_shareText shareImage:[UIImage imageNamed:_imageName] shareToSnsNames:[NSArray arrayWithObjects:UMShareToWechatSession,UMShareToWechatTimeline,UMShareToQzone,UMShareToSina,UMShareToTencent,nil]  delegate:nil];
}

接下來琐脏,是實(shí)現(xiàn)該代理方法(我在這里設(shè)了一個(gè)隨機(jī)數(shù)攒砖,傳到JS中,提供給JS使用日裙,后面JS就可以直接使用傳過去的這個(gè)隨機(jī)數(shù)):

shareButtonManager.m
#pragma mark ShareButtonClickedDelegate
- (void)ButtonClicked {
  NSInteger x = arc4random() % 100;
  NSLog(@"原生事件%ld",x);
// 將onButtonClicked事件導(dǎo)出
  _bt.onButtonClicked(@{@"randomValue": [NSNumber numberWithInteger:x]});
}

下面我們在js文件中處理:
同樣吹艇,在參數(shù)中添加上onButtonClicked。

ZKShareButton.js

//按鈕點(diǎn)擊事件onButtonClicked:PropTypes.func,

添加好之后昂拂,就可以調(diào)用了受神,調(diào)用如下:

onButtonClicked={(event) => { console.log('React事件' + event.nativeEvent.randomValue);}}

結(jié)果顯示:

[連接]
(http://bbs.reactnative.cn/topic/2452/react-native%E5%8E%9F%E7%94%9Fui%E5%B0%81%E8%A3%85%E4%BB%A5%E5%8F%8A%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市格侯,隨后出現(xiàn)的幾起案子鼻听,更是在濱河造成了極大的恐慌,老刑警劉巖联四,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撑碴,死亡現(xiàn)場離奇詭異,居然都是意外死亡朝墩,警方通過查閱死者的電腦和手機(jī)醉拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來收苏,“玉大人廉嚼,你說我怎么就攤上這事〉瓜罚” “怎么了怠噪?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杜跷。 經(jīng)常有香客問我傍念,道長矫夷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任憋槐,我火速辦了婚禮双藕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阳仔。我一直安慰自己忧陪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布近范。 她就那樣靜靜地躺著嘶摊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪评矩。 梳的紋絲不亂的頭發(fā)上叶堆,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音斥杜,去河邊找鬼虱颗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蔗喂,可吹牛的內(nèi)容都是我干的忘渔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缰儿,長吁一口氣:“原來是場噩夢啊……” “哼辨萍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起返弹,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤锈玉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后义起,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拉背,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年默终,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椅棺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡齐蔽,死狀恐怖两疚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情含滴,我是刑警寧澤诱渤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谈况,受9級(jí)特大地震影響勺美,放射性物質(zhì)發(fā)生泄漏递胧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一赡茸、第九天 我趴在偏房一處隱蔽的房頂上張望缎脾。 院中可真熱鬧,春花似錦占卧、人聲如沸遗菠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辙纬。三九已至,卻和暖如春友多,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堤框。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工域滥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜈抓。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓启绰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沟使。 傳聞我的和親對(duì)象是個(gè)殘疾皇子委可,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 對(duì)于目前的移動(dòng)端原生開發(fā)來說,想要完成一個(gè)app的開發(fā)工作是比較容易的腊嗡,因?yàn)樵a在網(wǎng)上所提供出來的各種開源的第...
    街角仰望閱讀 1,056評(píng)論 6 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • 對(duì)于目前的移動(dòng)端原生開發(fā)來說着倾,想要完成一個(gè)app的開發(fā)工作是比較容易的,因?yàn)樵a在網(wǎng)上所提供出來的各種開源的第...
    正凱閱讀 16,549評(píng)論 17 50
  • “不經(jīng)歷風(fēng)雨燕少,怎么能見到彩虹卡者,” 其實(shí)天空也遵循‘磨練’的規(guī)律,所以將那一彎絢麗架在無邊的風(fēng)雨之后客们,向人們...
    劈柴喂馬走天下閱讀 457評(píng)論 2 4
  • 一個(gè)宅在宿舍的周末底挫,很是悠閑恒傻,和小笨、其其建邓、歐美范一起吃飯盈厘、逛街、看視頻官边。好在看了一本書扑庞,才讓時(shí)間過得不那么失色譬重。...
    簡福_Jane閱讀 270評(píng)論 0 1