最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ReactiveCocoa代碼實(shí)踐之-UI組件的RAC信號(hào)操作

 更新時(shí)間:2016年04月20日 10:02:47   作者:董鉑然  
這篇文章主要介紹了ReactiveCocoa代碼實(shí)踐之-UI組件的RAC信號(hào)操作 的相關(guān)資料,需要的朋友可以參考下

相關(guān)閱讀:

ReactiveCocoa代碼實(shí)踐之-更多思考

ReactiveCocoa代碼實(shí)踐之-RAC網(wǎng)絡(luò)請求重構(gòu)這一節(jié)是自己對網(wǎng)絡(luò)層的一些重構(gòu),本節(jié)是自己一些代碼小實(shí)踐做出的一些demo程序,基本涵蓋大多數(shù)UI控件操作。

一.用UISlider實(shí)現(xiàn)調(diào)色板

假設(shè)我們現(xiàn)在做一個(gè)demo,上面有一個(gè)View用來展示顏色,下面有三個(gè)UISlider滑竿分別控制RGB的色值,隨著不同滑竿的拖動(dòng)上面view的顏色會(huì)隨之改變。 可以先腦補(bǔ)一下不用RAC該怎么寫。 如果使用RAC只需要將三個(gè)信號(hào)包裝起來用適當(dāng)?shù)牟僮骶湍軐?shí)現(xiàn)。

// 拖線的UI控件
@property (weak, nonatomic) IBOutlet UIView *topView;
@property (weak, nonatomic) IBOutlet UISlider *slider;
@property (weak, nonatomic) IBOutlet UISlider *slider;
@property (weak, nonatomic) IBOutlet UISlider *slider;
// viewDidLoad中
// 分別將三個(gè)控件的改變都包成一個(gè)信號(hào)。
RACSignal *s = [[self.slider rac_newValueChannelWithNilValue:@]startWith:@];
RACSignal *s = [[self.slider rac_newValueChannelWithNilValue:@]startWith:@];
RACSignal *s = [[self.slider rac_newValueChannelWithNilValue:@]startWith:@];
RACSignal *threeSignal = [RACSignal combineLatest:@[s,s,s] reduce:^id(NSNumber* value,NSNumber* value,NSNumber* value){
return @[value,value,value];
}];
// 監(jiān)聽這個(gè)"合成"后的信號(hào),改變view的顏色
[threeSignal subscribeNext:^(NSArray *arr) {
self.topView.backgroundColor = [UIColor colorWithRed:[arr[] doubleValue] green:[arr[] doubleValue] blue:[arr[] doubleValue] alpha:];
}]; 

上面的startWith:@0需要注意,如果不加這個(gè)初始值那必須在三個(gè)滑竿都動(dòng)一下才能顯示顏色。 上面使用的方法時(shí)UISlider專屬的,也可以用下面的方法寫,這個(gè)是UIControl的方法會(huì)支持更多其他UI控件。

RACSignal *s1 = [[[self.slider1 rac_signalForControlEvents:UIControlEventValueChanged] map:^id(id value) {
return @(self.slider1.value);
}] startWith:@0];

二.簡潔代碼實(shí)現(xiàn)登錄邏輯

在UI控件中難點(diǎn)不多,但是值得注意的就是各種狀態(tài)的多級管理,如果哪里疏忽了就很容易造成bug,這也就導(dǎo)致很多地方有判斷結(jié)構(gòu),并且各種來回賦值。 假設(shè)現(xiàn)在需要做一個(gè)登錄框,有賬號(hào)密碼和同意條款三項(xiàng),必須滿足賬號(hào)密碼大于2位且選擇了同意,才允許注冊。 舊的寫法非常麻煩,還需要監(jiān)聽valueChange事件等。如果用RAC只需要寫如下代碼:

@property (weak, nonatomic) IBOutlet UITextField *accountTxt;
@property (weak, nonatomic) IBOutlet UITextField *pwdTxt;
@property (weak, nonatomic) IBOutlet SXSwitch *agreeSw; // 同意條款
@property (weak, nonatomic) IBOutlet UIButton *loginBtn; // 注冊按鈕
// viewDidLoad方法
self.loginBtn.enabled = NO;
RAC(self.loginBtn , enabled) = [RACSignal combineLatest:@[self.accountTxt.rac_textSignal , self.pwdTxt.rac_textSignal, self.agreeSw.rac_newOnChannel] reduce:^(NSString *account, NSString *pwd, NSNumber *isOn){
return @((account.length > )&&(pwd.length >)&&[isOn boolValue]);
}]; 

這其中combineLatest數(shù)組中用的都是控件專屬的信號(hào), 也可以使用RAC(self.agreeSw, on) 這種寫法直接把某一個(gè)屬性的狀態(tài)用信號(hào)傳過來。但是這里需要注意:假設(shè)你監(jiān)聽了A類的B屬性時(shí),只有走了B屬性的set方法才會(huì)被監(jiān)聽捕獲,如果是通過其他方法修改的屬性值則無效。 比如UISwitch的來回?fù)軇?dòng)過程中并沒有走on這個(gè)屬性的set方法。

三.通過interval方法實(shí)現(xiàn)時(shí)鐘

這是一種默認(rèn)循環(huán)的方法,除非你通過控制Disposable把他禁了。 interval這個(gè)方法就是傳入一個(gè)參數(shù)是間隔時(shí)間,然后內(nèi)部每隔這一段時(shí)間就發(fā)一個(gè)[NSDate date]的對象,然后block內(nèi)部把這個(gè)date設(shè)置一個(gè)格式以字符串的方法返回。

RAC(self, timeLabel.text) = [[[RACSignal interval: onScheduler:[RACScheduler currentScheduler]] startWith:[NSDate date]] map:^id (NSDate *value) {
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:value];
return [NSString stringWithFormat:@"%ld:%ld:%ld", (long)dateComponents.hour, (long)dateComponents.minute, (long)dateComponents.second];
}];

四.其他控件事件操作

除了上面的UIButton,UISlider,UIControl的分類方法還有很多操作

UISegmentedControl (RACSignalSupport)分類就為此控件提供了便捷處理方法,相比于常規(guī)的監(jiān)聽seg的元素點(diǎn)擊事件,再取出當(dāng)前選中的index。RACSignal可以直接得到需要的值

[[self.seg rac_newSelectedSegmentIndexChannelWithNilValue:@]subscribeNext:^(id x) {
// 返回的基本數(shù)據(jù)類型都被裝包成NSNumber,可在此做一些判斷操作
NSLog(@"selectIndex-%@",x);
}];

UIDatePicker (RACSignalSupport)分類為時(shí)間選擇框封裝了一個(gè)操作,每當(dāng)選框改變時(shí)返回NSDate類型

[[picker rac_newDateChannelWithNilValue:[NSDate date]]subscribeNext:^(NSDate *x) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"HH:mm";
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
NSString *dateStr = [dateFormatter stringFromDate:x];
}]; 

如果在這里給控件賦值,每一次改動(dòng)都會(huì)讓展示控件的值更新,如果有的設(shè)計(jì)不希望這么頻繁只有在點(diǎn)擊確認(rèn)后再將時(shí)間顯示可以根據(jù)自己喜好自行賦值。

除此這些還有很多UI控件綁定的方法 UIAlertView (RACSignalSupport) 里面就提供了一些方法比如點(diǎn)擊彈窗按鈕可以在subscribeNext里統(tǒng)一處理各個(gè)按鈕的點(diǎn)擊事件。 但是現(xiàn)在UIAlertView已被UIAlertController取代所以,UIAlertView和UIActionSheet這里可以忽略不提。

五.生命周期相關(guān)操作

UITableView和UICollectionView的Cell都有重用的機(jī)制,如果給這個(gè)Cell綁定了一些監(jiān)聽,那這個(gè)Cell被重用它子控件的監(jiān)聽該何去何從?UITableViewCell (RACSignalSupport)、UICollectionReusableView (RACSignalSupport)這兩個(gè)分類里提供了即將重用時(shí)的信號(hào)rac_prepareForReuseSignal

做過兩個(gè)類似的場景,一個(gè)是tableView的cell回復(fù)按鈕點(diǎn)擊會(huì)跳到回復(fù)頁,一個(gè)是collection的item內(nèi)有個(gè)按鈕點(diǎn)擊就變顏色。

// UITableViewDataSource
- (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
SXFeedbackCell * cell = [tableView dequeueReusableCellWithIdentifier:@"SXFeedbackCell"];
@weakify(self)
[[[cell.replyButton rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:cell.rac_prepareForReuseSignal]
subscribeNext:^(UIButton *x) {
@strongify(self)
// 處理一些其他邏輯
[self.navigationController pushViewController:[SXReplyPage new] animated:YES];
}];
return cell;
}
// UICollectionViewDataSource
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell * cell = [collectionView dequeueReusableCellWithIdentifier:@"SXDownloadCell"];
[[[cell.changeBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:cell.rac_prepareForReuseSignal]
subscribeNext:^(UIButton *x) {
cell.backgroundColor = [UIColor grayColor];
}];
return cell;
}

其中takeUntil操作是監(jiān)聽某個(gè)事件直到什么時(shí)候結(jié)束。當(dāng)這個(gè)cell即將重用時(shí)rac_prepareForReuseSignal到來會(huì)觸發(fā)disposable信號(hào)結(jié)束監(jiān)聽。

非重用類型的控件的生命周期可以用rac_willDeallocSignal 信號(hào)監(jiān)聽,但是在開發(fā)中很少會(huì)用到此信號(hào),因?yàn)榇蠖嗍切盘?hào)操作的內(nèi)部代碼里都幫你做了這個(gè)操作,即監(jiān)聽一個(gè)事件直到自己結(jié)束時(shí)停止監(jiān)聽。

// rac_textSignal源碼
- (RACSignal *)rac_textSignal {
@weakify(self);
return [[[[[RACSignal
defer:^{
@strongify(self);
return [RACSignal return:self];
}]
concat:[self rac_signalForControlEvents:UIControlEventAllEditingEvents]]
map:^(UITextField *x) {
return x.text;
}]
takeUntil:self.rac_willDeallocSignal]
setNameWithFormat:@"%@ -rac_textSignal", self.rac_description];
}
// rac_signalForControlEvents源碼
- (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents {
@weakify(self);
return [[RACSignal
createSignal:^(id<RACSubscriber> subscriber) {
@strongify(self);
[self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents];
[self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{
[subscriber sendCompleted];
}]];
return [RACDisposable disposableWithBlock:^{
@strongify(self);
[self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents];
}];
}]
setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", self.rac_description, (unsigned long)controlEvents];
}

關(guān)于ReactiveCocoa代碼實(shí)踐之-UI組件的RAC信號(hào)操作就給大家介紹這么多,希望對大家有所幫助!

相關(guān)文章

  • react路由v6版本NavLink的兩個(gè)小坑及解決

    react路由v6版本NavLink的兩個(gè)小坑及解決

    這篇文章主要介紹了react路由v6版本NavLink的兩個(gè)小坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • React中super()和super(props)的區(qū)別小結(jié)

    React中super()和super(props)的區(qū)別小結(jié)

    本文主要介紹了React中super()和super(props)的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • React?Native實(shí)現(xiàn)Toast輕提示和loading效果

    React?Native實(shí)現(xiàn)Toast輕提示和loading效果

    這篇文章主要介紹了React Native實(shí)現(xiàn)Toast輕提示和loading效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • React嵌套組件的構(gòu)建順序

    React嵌套組件的構(gòu)建順序

    這篇文章主要介紹了React嵌套組件的構(gòu)建順序,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下
    2021-04-04
  • React?Hooks鉤子中API的使用示例分析

    React?Hooks鉤子中API的使用示例分析

    在react類組件(class)寫法中,有setState和生命周期對狀態(tài)進(jìn)行管理,但是在函數(shù)組件中不存在這些,故引入hooks(版本:>=16.8),使開發(fā)者在非class的情況下使用更多react特性
    2022-08-08
  • 詳解Immutable及 React 中實(shí)踐

    詳解Immutable及 React 中實(shí)踐

    Immutable 可以給 React 應(yīng)用帶來數(shù)十倍的提升,也有人說 Immutable 的引入是近期 JavaScript 中偉大的發(fā)明,因?yàn)橥?React 太火,它的光芒被掩蓋了。這篇文章主要介紹了Immutable及 React 中的實(shí)踐,需要的朋友可以參考下
    2018-03-03
  • 詳解使用create-react-app快速構(gòu)建React開發(fā)環(huán)境

    詳解使用create-react-app快速構(gòu)建React開發(fā)環(huán)境

    這篇文章主要介紹了詳解使用create-react-app快速構(gòu)建React開發(fā)環(huán)境,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • react hooks使用Echarts圖表中遇到的情況及相關(guān)配置問題

    react hooks使用Echarts圖表中遇到的情況及相關(guān)配置問題

    這篇文章主要介紹了react hooks使用Echarts圖表中遇到的情況及相關(guān)配置問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react執(zhí)行【npx create-react-app my-app】出現(xiàn)常見錯(cuò)誤的解決辦法

    react執(zhí)行【npx create-react-app my-app】出現(xiàn)常見錯(cuò)誤的解決辦法

    文章主要介紹了在使用npx創(chuàng)建React應(yīng)用時(shí)可能遇到的幾種常見錯(cuò)誤及其解決方法,包括缺少依賴、網(wǎng)絡(luò)問題和npx解析錯(cuò)誤等,并提供了相應(yīng)的解決措施,此外,還提到了使用騰訊云云產(chǎn)品來支持React應(yīng)用開發(fā)
    2024-11-11
  • React學(xué)習(xí)筆記之條件渲染(一)

    React學(xué)習(xí)筆記之條件渲染(一)

    條件渲染在React里就和js里的條件語句一樣。下面這篇文章主要給大家介紹了關(guān)于React學(xué)習(xí)記錄之條件渲染的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07

最新評論

洮南市| 岐山县| 瑞昌市| 习水县| 报价| 清水河县| 宣恩县| 佛山市| 嘉鱼县| 开阳县| 资源县| 怀柔区| 镇坪县| 格尔木市| 汪清县| 禹州市| 龙游县| 铁力市| 保定市| 普兰县| 方城县| 武强县| 元阳县| 东乡县| 昆明市| 资中县| 芮城县| 凤凰县| 西盟| 碌曲县| 黔江区| 太原市| 上栗县| 六枝特区| 衡水市| 郯城县| 依兰县| 许昌市| 凤冈县| 沙湾县| 衡阳县|