协议、反向传值

来源:互联网 发布:易语言小软件 编辑:程序博客网 时间:2024/06/07 15:31
  • 总体:
    谁想做什么事,谁就定义协议,并设置一个代理;
    谁想帮做什么事,谁就遵守协议并实现方法。
////  SecondVC.h//  delegate////  Created by yy on 2017/11/17.//  Copyright © 2017年 zg. All rights reserved.//#import <UIKit/UIKit.h>@class SecondVC;// 1.自己声明的协议需要遵守<NSObject>协议// respondsToSelector方法是在<NSObject>协议中声明的方法。// 不遵守的话,self.delegate失去了<NSObject>协议中的所有方法声明,所以就导致方法不可识别.@protocol passValueDelegate <NSObject>@optional- (void)viewController:(SecondVC*)secondVC passInfo:(id)info;@end@interface SecondVC : UIViewController@property (weak, nonatomic) IBOutlet UITextField *textField;@property (weak, nonatomic) IBOutlet UIButton *backToFirstVCButton;// weak修饰,防止循环引用,执行self.delegate = self,引用计数不会加1,在dealloc中会释放;// strong的话,不会释放,循环引用,内存泄漏@property (nonatomic,weak)id<passValueDelegate>passDelegate;// 2.定义代理@end
////  SecondVC.m//  delegate////  Created by yy on 2017/11/17.//  Copyright © 2017年 zg. All rights reserved.//#import "SecondVC.h"@interface SecondVC ()@end@implementation SecondVC- (void)viewDidLoad {    [super viewDidLoad];    [self.backToFirstVCButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];}-(void)buttonClick:(UIButton*)sender{    // 代理对象存在时且可以响应代理,这时,执行代理    if (self.passDelegate && [self.passDelegate respondsToSelector:@selector(viewController:passInfo:)]) {        [self.passDelegate viewController:self passInfo:self.textField.text];    }    [self dismissViewControllerAnimated:true completion:nil];}@end
////  ViewController.m//  delegate////  Created by yy on 2017/11/17.//  Copyright © 2017年 zg. All rights reserved.//#import "FirstVC.h"#import "SecondVC.h"@interface FirstVC ()<passValueDelegate> // 遵守协议@end@implementation FirstVC- (void)viewDidLoad {    [super viewDidLoad];    [self.toSecondVCButton addTarget:self action:@selector(toSecond:) forControlEvents:UIControlEventTouchUpInside];}- (void)toSecond:(UIButton*)sender{    SecondVC * secondVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"SecondVC"];    secondVC.passDelegate = self; // 代理赋值    [self presentViewController:secondVC animated:true completion:nil];}// 实现代理的方法- (void)viewController:(SecondVC *)secondVC passInfo:(id)info{    self.label.text = info;}@end
阅读全文
0 0
原创粉丝点击