RAC系統化學習


1、RACSignal:

  // 只要訂閱者調用sendNext,就會執行nextBlock

   // 只要訂閱RACDynamicSignal,就會執行didSubscribe

   // 前提條件是RACDynamicSignal,不同類型信號的訂閱,處理訂閱的事情不一樣

 //創建信號,此時信號是冷信號,並不能發送數據
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
       
        [subscriber sendNext:@"發送數據"];
//信號銷毀
return [RACDisposable disposableWithBlock:^{ NSLog(@"信號取消訂閱"); }]; }]; //信號訂閱,此時信號變為熱信號,接收到數據 [signal subscribeNext:^(id x) {

      // nextBlock調用:只要訂閱者發送數據就會調用

        NSLog(@"%@", x);
    }];

2、RACSubject

 //創建信號
    RACSubject *subject = [RACSubject subject];
    /*
      不同信號訂閱的方式不一樣
      RACSubject處理訂閱:僅僅是保存訂閱者,可以多個訂閱者
      底層實現:遍歷所有的訂閱者,調用nextBlock
     
      執行流程:
      RACSubject被訂閱,僅僅是保存訂閱者
      RACSubject發送數據,遍歷所有的訂閱,調用他們的nextBlock
     */
    [subject subscribeNext:^(id x) {
       
        NSLog(@"++++++%@", x);
        
    }];
    [subject subscribeNext:^(id x) {
        
        NSLog(@"-----%@", x);
        
    }];
    [subject sendNext:@111];

 3、RACReplaySubject

 //創建信號
RACReplaySubject *replaySubject = [RACReplaySubject subject];
//可以先發送數據再訂閱信號
[replaySubject sendNext:@111111];
[replaySubject subscribeNext:^(id x) {
       
        NSLog(@"---%@", x);
        
    }];
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"+++++%@", x);
        
    }];

4、RAC中的KVO、通知、監聽事件、監聽文本框、計時器

 //KVO
//方式一:其中_redView是屬性UIView,監聽frame變化
[_redView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) { //value就是frame變化之后的值 NSLog(@"----%@", value); }];
//方式二: [[_redView rac_valuesForKeyPath:
@"frame" observer:nil] subscribeNext:^(id x) { NSLog(@"+++++%@", x); }]; //監聽事件,監聽按鈕的點擊事件 [[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"控制器按鈕被點擊"); }];
//_label增加點擊手勢,監聽點擊事件 UITapGestureRecognizer
*tap = [[UITapGestureRecognizer alloc]init]; [[tap rac_gestureSignal] subscribeNext:^(UITapGestureRecognizer *x) { NSLog(@"----label增加單擊手勢%@", x); }]; [_label addGestureRecognizer:tap]; //通知,監聽鍵盤彈起的通知 [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) { NSLog(@"%@", x); }]; //監聽文本框,只要文本框中內容一產生變化,就會走這個block [_textField.rac_textSignal subscribeNext:^(id x) { NSLog(@"%@", x); }]; [[_textField rac_signalForControlEvents:UIControlEventEditingDidEndOnExit] subscribeNext:^(id x) { //return之后隱藏鍵盤 //x是TextField NSLog(@"%@",x); }]; //延遲一定時間做某事 [[RACScheduler mainThreadScheduler]afterDelay:2.0f schedule:^{ NSLog(@"2秒之后發生的事情"); }]; // 每個一定長度時間做一件事,類似NSTimer [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]]subscribeNext:^(NSDate * date) { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; _label.text = [formatter stringFromDate:date]; // NSLog(@"%@",[formatter stringFromDate:date]); }];
//監聽UIAlertView彈框的點擊事件 UIAlertView
* alertView = [[UIAlertView alloc]initWithTitle:@"警告" message:@"是否確認登錄?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
//實現alertView的點擊事件的delegate方法 [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:
@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple * tuple) { //點擊取消、確定按鈕會到本block RACTupleUnpack(UIAlertView *alert, NSNumber *index) = tuple; NSLog(@"alertView : %@------%@",alert, index); }]; [alertView show]; //類似UIAlertView UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"相機", @"相冊", nil]; [[self rac_signalForSelector:@selector(actionSheet:clickedButtonAtIndex:) fromProtocol:@protocol(UIActionSheetDelegate)] subscribeNext:^(RACTuple * tuple) { RACTupleUnpack(UIActionSheet *alert, NSNumber *index) = tuple; NSLog(@"alertView : %@------%@",alert, index); }]; [sheet showInView:self.view];

5、RAC中的集合:

    //類似NSArray
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@1, @"dssds", @3]]; NSNumber *first = tuple[0]; NSLog(@"%@", first); //array NSArray *array = @[@"123", @"456", @"789"]; //RAC集合 RACSequence *sequence = array.rac_sequence; //轉化為信號 RACSignal *signal = sequence.signal; [signal subscribeNext:^(id x) { NSLog(@"%@", x); }];
//聯合起來遍歷數據就是: [array.rac_sequence.signal subscribeNext:
^(id x) { NSLog(@"------%@", x); }]; //Dict NSDictionary *dict = @{@"name" : @"小明", @"age" : @"20"}; [dict.rac_sequence.signal subscribeNext:^(RACTuple *x) { // NSString *key = x[0]; // NSString *value = x[1]; // NSLog(@"key : %@, value : %@", key, value); // RACTupleUnpack:用來解析元組 // 宏里面的參數,傳需要解析出來的變量名 // = 右邊,放需要解析的元組 RACTupleUnpack(NSString *key, NSString *value) = x; NSLog(@"%@--%@", key, value); }]; NSArray *allModels = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil]]; // NSMutableArray *models = [NSMutableArray array]; // [allModels.rac_sequence.signal subscribeNext:^(NSDictionary *x) { // // FlagModel *model = [FlagModel flagWithDict:x]; // [models addObject:model]; // // }];
//models數組中的數據是已經將數據轉好的模型數據 NSArray *models = [[allModels.rac_sequence map:^id(id value) {
//字典轉模型
return [FlagModel flagWithDict:value]; }] array]; NSLog(@"-----%@", models);

6、RACMulticastConnection

//弊端:有幾個訂閱者就會請求幾次數據
    // 1.創建信號
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        NSLog(@"發送熱門模塊的請求");
        // 3.發送數據
        [subscriber sendNext:@1];
        return nil;
    }];
    // 2.訂閱信號
    [signal subscribeNext:^(id x) {
        NSLog(@"訂閱者一%@",x);
    }];
    [signal subscribeNext:^(id x) {
        
        NSLog(@"訂閱者二%@",x);
    }];
    
//弊端優化
    // 不管訂閱多少次信號,就會請求一次
    // RACMulticastConnection:必須要有信號
    // 1.創建信號
    RACSignal *signal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // didSubscribe什么時候來:連接類連接的時候
        NSLog(@"發送熱門模塊的請求");
        [subscriber sendNext:@"熱門模塊的數據"];
        
        return nil;
    }];
    // 2.把信號轉換成連接類
    // 確定源信號的訂閱者RACSubject
    //    RACMulticastConnection *connection = [signal publish];
    RACMulticastConnection *connection = [signal2 multicast:[RACReplaySubject subject]];
    
    // 3.訂閱連接類信號
    [connection.signal subscribeNext:^(id x) {
        // nextBlock:發送數據就會來
        NSLog(@"訂閱者1:%@",x);
    }];
    // 4.連接
    [connection connect];

7、RACCommand

//創建RACCommand,RACCommand命令在RAC很常用,常用語網絡請求
RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) { NSLog(@"---input = %@", input); //11 return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//網絡請求,將請求的數據發送出去 [subscriber sendNext:
@"網絡請求的數據"]; return nil; }]; }]; //取到command創建的RACSignal //方式一: RACSignal *signal = [command execute:@1]; [signal subscribeNext:^(id x) { NSLog(@"---%@", x); }]; //方式2: // 注意:必須要在執行命令前,訂閱 // executionSignals:信號源,信號中信號,signalOfSignals:信號:發送數據就是信號 [command.executionSignals subscribeNext:^(RACSignal *x) { NSLog(@"%@", x); [x subscribeNext:^(id x) { NSLog(@"%@", x); }]; }]; //方式3: switchToLatest獲取最新發送的信號,只能用於信號中信號 [command.executionSignals.switchToLatest subscribeNext:^(id x) { NSLog(@"--x = %@", x); }]; [command execute:@23]; //下面對信號中的信號講解: // 創建信號中信號 RACSubject *signalOfSignals = [RACSubject subject]; RACSubject *signalA = [RACSubject subject]; RACSubject *signalB = [RACSubject subject]; // 訂閱信號 // [signalOfSignals subscribeNext:^(RACSignal *x) { // [x subscribeNext:^(id x) { // NSLog(@"%@",x); // }]; // }]; // switchToLatest:獲取信號中信號發送的最新信號 [signalOfSignals.switchToLatest subscribeNext:^(id x) { NSLog(@"%@",x); }]; // 發送信號 [signalOfSignals sendNext:signalA]; [signalA sendNext:@1]; [signalB sendNext:@"BB"]; [signalA sendNext:@"11"]; //********************************************************************************************************************** // 當前命令內部發送數據完成,一定要主動發送完成 // 1.創建命令 RACCommand *command2 = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { // input:執行命令傳入參數 // Block調用:執行命令的時候就會調用 NSLog(@"%@",input); return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 發送數據 [subscriber sendNext:@"執行命令產生的數據"]; // 發送完成 [subscriber sendCompleted]; return nil; }]; }]; // 監聽事件有沒有完成 [command2.executing subscribeNext:^(id x) { if ([x boolValue] == YES) { // 當前正在執行 NSLog(@"當前正在執行"); }else{ // 執行完成/沒有執行 NSLog(@"執行完成/沒有執行"); } }]; // 2.執行命令 [command2 execute:@1];

8、bind,信號的綁定

    // 1.創建信號
    RACSubject *subject = [RACSubject subject];
    // 2.綁定信號
    RACSignal *bindSignal = [subject bind:^RACStreamBindBlock{
        // block調用時刻:只要綁定信號被訂閱就會調用
        return ^RACSignal *(id value, BOOL *stop){
            // block調用:只要源信號發送數據,就會調用block
            // block作用:處理源信號內容
            // value:源信號發送的內容
            
            NSLog(@"接收到原信號的內容:%@",value);
            value = [NSString stringWithFormat:@"xmg:%@",value];
            // 返回信號,不能傳nil,返回空信號[RACSignal empty]
            return [RACReturnSignal return:value];
        };
    }];
    
    // 3.訂閱綁定信號
    [bindSignal subscribeNext:^(id x) {
        // blcok:當處理完信號發送數據的時候,就會調用這個Block
        NSLog(@"接收到綁定信號處理完的信號%@",x);
    }];
    // 4.發送數據
    [subject sendNext:@"123"];

9、map、flattenMap

//map、flattenMap主要是對發送的數據進行編輯,如:可以將網絡請求的數據轉化的模型在發送
// 創建信號, RACSubject *subject2 = [RACSubject subject]; // 綁定信號 RACSignal *bindSignal2 = [subject2 map:^id(id value) { // 返回的類型,就是你需要映射的值 return [NSString stringWithFormat:@"請求的數據:%@",value]; }]; // 訂閱綁定信號 [bindSignal2 subscribeNext:^(id x) { NSLog(@"%@",x); }]; [subject2 sendNext:@"123"]; //******************flattenMap一般用於信號中的信號******************************* RACSubject *signalOfsignals = [RACSubject subject]; RACSubject *signal = [RACSubject subject]; [[signalOfsignals flattenMap:^RACStream *(id value) { return value; }] subscribeNext:^(id x) { NSLog(@"%@",x); }]; // 發送信號 [signalOfsignals sendNext:signal]; [signal sendNext:@"213"];

10、組合

// 組合,兩個信號都完成才執行
    // concat:皇上,皇太子
    // 創建信號A
    RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 發送請求
        NSLog(@"發送上部分請求");
        // 發送信號
        [subscriber sendNext:@"上部分數據"];
        
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 發送請求
        NSLog(@"發送下部分請求");
        // 發送信號
        [subscriber sendNext:@"下部分數據"];
        
        return nil;
    }];
    
    // concat:按順序去連接
    // 注意:concat,第一個信號必須要調用sendCompleted
    // 創建組合信號
    RACSignal *concatSignal = [siganlA concat:siganlB];
    
    // 訂閱組合信號
    [concatSignal subscribeNext:^(id x) {
        
        // 既能拿到A信號的值,又能拿到B信號的值
        NSLog(@"%@",x);
        
    }];
    
//***************************************************************************************************
    
    // 創建信號A
    RACSignal *siganl1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 發送請求
        NSLog(@"發送上部分請求");
        // 發送信號
        [subscriber sendNext:@"上部分數據"];
        
        // 發送完成
        [subscriber sendCompleted];
        
        return nil;
    }];
    
    // 創建信號B
    RACSignal *siganl2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 發送請求
        NSLog(@"發送下部分請求");
        // 發送信號
        [subscriber sendNext:@"下部分數據"];
        
        return nil;
    }];
    
    // 創建組合信號
    // then:忽悠掉第一個信號所有值
    RACSignal *thenSiganl = [siganl1 then:^RACSignal *{
        // 返回信號就是需要組合的信號
        return siganl2;
    }];
    
    // 訂閱信號
    [thenSiganl subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];
    
    //***************************************************************************************************

    // 創建信號A
    RACSubject *signalA = [RACSubject subject];
    
    // 創建信號B
    RACSubject *signalB = [RACSubject subject];
    
    // 組合信號
    RACSignal *mergeSiganl = [signalA merge:signalB];
    
    // 訂閱信號
    [mergeSiganl subscribeNext:^(id x) {
        // 任意一個信號發送內容都會來這個block
        NSLog(@"%@",x);
    }];
    
    // 發送數據
    [signalB sendNext:@"下部分"];
    [signalA sendNext:@"上部分"];

    
    //***************************************************************************************************
    // zipWith:夫妻關系
    // 創建信號A
    RACSubject *signalC = [RACSubject subject];
    
    // 創建信號B
    RACSubject *signalD = [RACSubject subject];
    
    // 壓縮成一個信號
    // zipWith:當一個界面多個請求的時候,要等所有請求完成才能更新UI
    // zipWith:等所有信號都發送內容的時候才會調用
    RACSignal *zipSignal = [signalC zipWith:signalD];
    
    // 訂閱信號
    [zipSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    
    // 發送信號
    [signalD sendNext:@2];
    [signalC sendNext:@1];
    
    
     //***************************************************************************************************
    // 組合
    // 組合哪些信號
    // reduce:聚合
    // reduceBlock參數:根組合的信號有關,一一對應
    RACSignal *comineSiganl = [RACSignal combineLatest:@[_accountFiled.rac_textSignal,_pwdField.rac_textSignal] reduce:^id(NSString *account,NSString *pwd){
        // block:只要源信號發送內容就會調用,組合成新一個值
        NSLog(@"%@ %@",account,pwd);
        // 聚合的值就是組合信號的內容
        
        return @(account.length && pwd.length);
    }];
    
    // 訂閱組合信號
    //    [comineSiganl subscribeNext:^(id x) {
    //        _loginBtn.enabled = [x boolValue];
    //    }];
    
    RAC(_loginBtn,enabled) = comineSiganl;

11、過濾

 // 只有當我們文本框的內容長度大於5,才想要獲取文本框的內容
    [[_textField.rac_textSignal filter:^BOOL(id value) {
        // value:源信號的內容
        return  [value length] > 5;
        // 返回值,就是過濾條件,只有滿足這個條件,才能能獲取到內容
        
    }] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];
    
    //***************************************************************************************************
    // ignore:忽略一些值
    // ignoreValues:忽略所有的值
    
    // 1.創建信號
    RACSubject *subject = [RACSubject subject];
    
    // 2.忽略一些
    RACSignal *ignoreSignal = [subject ignoreValues];
    
    // 3.訂閱信號
    [ignoreSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    // 4.發送數據
    [subject sendNext:@"13"];
    [subject sendNext:@"2"];
    [subject sendNext:@"44"];
    
    //***************************************************************************************************
    // 1.創建信號
    RACSubject *subject2 = [RACSubject subject];
    
    RACSubject *signal = [RACSubject subject];
    
    // take:取前面幾個值
    // takeLast:取后面多少個值.必須要發送完成
    // takeUntil:只要傳入信號發送完成或者發送任意數據,就不能在接收源信號的內容
    [[subject2 takeUntil:signal] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    
    [subject2 sendNext:@"1"];
    
    //    [signal sendNext:@1];
    //    [signal sendCompleted];
    [signal sendError:nil];
    
    [subject2 sendNext:@"2"];
    [subject2 sendNext:@"3"];
    //***************************************************************************************************
    
    // distinctUntilChanged:如果當前的值跟上一個值相同,就不會被訂閱到
    // 1.創建信號
    RACSubject *subject3 = [RACSubject subject];
    
    [[subject3 distinctUntilChanged] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    
    [subject3 sendNext:@"1"];
    [subject3 sendNext:@"2"];
    [subject3 sendNext:@"2"];
    
    //***************************************************************************************************

    // skip;跳躍幾個值
    // 1.創建信號
    RACSubject *subject4 = [RACSubject subject];
    
    [[subject4 skip:2] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];
    
    [subject4 sendNext:@"1"];
    [subject4 sendNext:@"2"];
    [subject4 sendNext:@"3"];

12、RAC其他一些操作

 //********************************************
    [[[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside]
       
       doNext:^(id x) {
           
           [self.btn setTitle:@"你好" forState:UIControlStateNormal];
           
       }]
      
      map:^id(id value) {
          
          return @(YES);
          
      }]
     
     subscribeNext:^(NSNumber *x) {
         
         self.btn.backgroundColor = x ? [UIColor orangeColor] : [UIColor cyanColor];
         
     }];
    
    //**************************************************************
    //doNext: 執行Next之前,會先執行這個Block
    //doCompleted: 執行sendCompleted之前,會先執行這個Block
    
    [[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendCompleted];
        return nil;
    }] doNext:^(id x) {
        // 執行[subscriber sendNext:@1];之前會調用這個Block
        NSLog(@"doNext");;
    }] doCompleted:^{
        // 執行[subscriber sendCompleted];之前會調用這個Block
        NSLog(@"doCompleted");;
        
    }] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];
    
    
    //*********************************************************
    //timeout:超時,可以讓一個信號在一定的時間后,自動報錯。
    
    RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        return nil;
    }] timeout:1 onScheduler:[RACScheduler currentScheduler]];
    
    [signal subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    } error:^(NSError *error) {
        // 1秒后會自動調用
        NSLog(@"%@",error);
    }];
    
    
    //interval 定時:每隔一段時間發出信號
    [[RACSignal interval:1 onScheduler:[RACScheduler currentScheduler]] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];
    
    
    //delay 延遲發送next。
    [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        [subscriber sendNext:@1];
        return nil;
        
    }] delay:2] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];
    
    //*********************************************************
    //retry重試 :只要失敗,就會重新執行創建信號中的block,直到成功.
    __block int i = 0;
    [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        if (i == 10) {
            [subscriber sendNext:@1];
        }else{
            NSLog(@"接收到錯誤");
            [subscriber sendError:nil];
        }
        i++;
        
        return nil;
        
    }] retry] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
        
    } error:^(NSError *error) {
        
    }];
    //*********************************************************
    //replay重放:當一個信號被多次訂閱,反復播放內容
    RACSignal *signal3 = [[RACSignal createSignal:^RACDisposable* (id<RACSubscriber> subscriber) {
        
        [subscriber sendNext:@1];
        [subscriber sendNext:@2];
        
        return nil;
    }] replay];
    
    [signal3 subscribeNext:^(id x) {
        
        NSLog(@"第一個訂閱者%@",x);
        
    }];
    
    [signal3 subscribeNext:^(id x) {
        
        NSLog(@"第二個訂閱者%@",x);
        
    }];
    //*********************************************************
    //throttle節流:當某個信號發送比較頻繁時,可以使用節流,在某一段時間不發送信號內容,過了一段時間獲取信號的最新內容發出。
    RACSubject *signal4 = [RACSubject subject];
    
    //    _signal = signal;
    
    // 節流,在一定時間(1秒)內,不接收任何信號內容,過了這個時間(1秒)獲取最后發送的信號內容發出。
    [[signal4 throttle:1] subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
    }];

13、RAC中常用的宏:

//1、防止循環引用,類似__weak typeof(self)waekSelf = self;
    @weakify(self)
[_textField.rac_textSignal subscribeNext:^(NSString *x) {
    @strongify(self)
       
 self.textField.text = x;
}];
//2、包裝元組
    RACTuple *tuple = RACTuplePack(@1, @2);
    NSLog(@"---%@", tuple[0]);
    
//之前賦值方式
//    [_textField.rac_textSignal subscribeNext:^(id x) {
//       
//        _label.text = x;
//        
//    }];
    // 用來給某個對象的某個屬性綁定信號,只要產生信號內容,就會把內容給屬性賦值
    RAC(_label, text) = _textField.rac_textSignal;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM