你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> iOS 代理反向傳值

iOS 代理反向傳值

編輯:IOS技巧綜合
[摘要]本文是對iOS 代理反向傳值的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

在上篇博客 iOS代理協議 中,側重解析了委托代理協議的概念等,本文將側重於它們在開發中的應用。

假如我們有一個需求如下:界面A上面有一個button、一個label。從界面A跳轉到界面B,在界面B的輸入框中輸入字符串,在界面A的label上顯示。這是一個典型的反向傳值的例子。這個例子的核心是:“在界面B的輸入框中輸入字符串,在界面A的label上顯示”。也就是說:“界面B委托界面A顯示字符串,頁面A是界面B的代理”。委托方向代理方反向傳值。

那麼我們該怎麼用代理設計模式來實現這個需求呢?

在程序中:

1.委托需要做的工作有:

1.1定義協議與方法

1.2聲明委托變量

1.3設置代理

1.4通過委托變量調用委托方法

2.代理需要做的工作有:

2.1遵循協議

2.2實現委托方法

在BViewController.h中:

//定義協議與方法
@protocol DeliverDetegate <NSObject>

- (void)setValue:(NSString *)string;

@end

@interface BViewController : UIViewController

//聲明委托變量
@property (weak,nonatomic) id<DeliverDetegate>B_Delegate;

@end

在BViewController.m中:

@interface BViewController ()<UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *DeliverText;

@end
- (IBAction)DeliverAction:(id)sender {
    
    //通過委托變量調用委托方法
    //輸入則顯示輸入的字符串,未輸入顯示“未填寫”
    if (![_DeliverText.text isEqualToString:@""]) {
        NSLog(@"B向A發送數據%@",_DeliverText.text);
        //判斷代理中的方法是否被實現,避免未被實現代理的程序崩潰
        if ([self.B_Delegate respondsToSelector:@selector(setValue:)])
        {
            [self.B_Delegate setValue:_DeliverText.text];
        }
    }
    else
    {
        NSLog(@"B向A發送數據%@",@"未填寫");
        //判斷代理中的方法是否被實現,避免未被實現代理的程序崩潰
        if ([self.B_Delegate respondsToSelector:@selector(setValue:)])
        {
            [self.B_Delegate setValue:@"未填寫"];
        }
    }
    
    [self.navigationController popViewControllerAnimated:YES];
}

在AViewController.m中

#import "AViewController.h"
#import "BViewController.h"

@interface AViewController ()<DeliverDetegate>

@property (strong, nonatomic) IBOutlet UILabel *TextLabel;

@end
- (IBAction)ReceiveAction:(id)sender {
    
    //遵循協議
    BViewController*BVC = [[BViewController alloc]init];
    BVC.B_Delegate = self;
    [self.navigationController pushViewController:BVC animated:YES];
}
//實現委托方法,即實現的setValue方法
- (void)setValue:(NSString *)string
{
    NSLog(@"A接收到B數據%@",string);
    _TextLabel.text = string;
}

最後的效果圖如下:

輸出日志:

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved