美文网首页
iOS 反向传值-代理(内含源码下载)

iOS 反向传值-代理(内含源码下载)

作者: 了念_ | 来源:发表于2018-03-04 19:03 被阅读15次

    源码下载

    反向传值-代理.gif

    简介

    最近一直在面试,在准备面试题的时候看到了关于代理传值的问题,自己也是一直对代理这一块比较晕,所以就深入查了一下,并完成了一个小Demo,希望可以给看这篇文章的朋友一些帮助。

    实现功能

    主要就是要实现一个反向传值的功能,在gif中也可以很明显的看出。
    1 控制器A上的按钮被点击
    2 弹出控制器B
    3 在控制器B的TextField中输入文字
    4 当控制器B被销毁的时候,返回自己TextField的内容给控制器A来显示。

    基本逻辑

    1. 首先判断谁应该是谁的代理,也就是谁应该监听谁。在本例中,A想要得到B的东西,那肯定是A需要监听B,所以A是代理。
    2. 既然A是代理,A就需要实现代理的方法,A负责实现,B当然就是负责定义。
    3. 什么时候传值?什么时候接收?主动权是在于被监听B的一方,所以B决定什么时候来传值,A只需要在B决定传值的时候接收就可以了。

    注意点

    1. 自定义的代理属性应该命名为delegate
    2. protocol应该写在被监听一方的h文件中
    3. 协议名字应该以被监听类的名字+Delegate命名
    4. 协议中方法名应该以被监听类名开头

    具体实现可以参照以下代码中的实现
    ViewController(监听类)

    //h文件
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    
    @end
    
    //m文件
    #import "ViewController.h"
    #import "SecondViewController.h"
    
    @interface ViewController ()<SecondViewControllerDelegate>
    @property (weak, nonatomic) IBOutlet UILabel *label;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    - (IBAction)showSecondVC:(id)sender {
        
        SecondViewController *secVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        
        secVC.delegate = self;
        
        [self showViewController:secVC sender:nil];
    }
    
    //代理方法
    - (void) secondViewConrollerGetContentFromText:(NSString *)text{
        [self.label setText:text];
        [self.view layoutIfNeeded];
    }
    
    @end
    
    

    SecondViewController(被监听类)

    //h文件
    #import <UIKit/UIKit.h>
    
    @interface SecondViewController : UIViewController ///<>
    @property(nonatomic, weak) id delegate;
    @end
    
    @protocol SecondViewControllerDelegate <NSObject>
    @optional
    - (void)secondViewConrollerGetContentFromText:(NSString *)text;
    
    @end
    
    
    //m文件
    #import "SecondViewController.h"
    
    @interface SecondViewController()<UITextFieldDelegate>
    @property (weak, nonatomic) IBOutlet UITextField *textField;
    @property (nonatomic, strong)NSMutableString *textContent;//需要反向传递的字符串
    @end
    
    @implementation SecondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.textField.delegate = self;
        // Do any additional setup after loading the view from its nib.
    }
    
    - (IBAction)back:(id)sender {
        
        if([self.delegate respondsToSelector:@selector(secondViewConrollerGetContentFromText:)]){
            
            [self.delegate secondViewConrollerGetContentFromText:self.textContent];
        }
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    
    
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
        self.textContent = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
        return YES;
    }
    
    
    @end
    
    

    如有描述不当之处,请指正

    相关文章

      网友评论

          本文标题:iOS 反向传值-代理(内含源码下载)

          本文链接:https://www.haomeiwen.com/subject/venffftx.html