iOS基础 - 代理:实现页面传值

▶ 代理传值

delegate 和 block 常用于逆向传值,两者都比较好用,但还是有区别的

A. delegate 在写法上比较麻烦,一方必须设置代理,另一方必须遵循代理且实现代理!其优势是代理的回调函数可以是多个函数,在不同的时机调用不同的回调函数;也可以说在一个协议中定义多个方法,在不同的触发事件中执行

B. block 在写法上比较自由,是一种轻量级的回调,它能够直接访问上下文,使用块的地方和块的实现地方在同一个地方,使得代码组织更加连贯。但是在使用 block 时需要注意防止循环引用,导致内存泄漏的问题

▶ 代码示例

实现第二页面向第一页面传值

// - SecondViewController.h:首先在将要传值的页面中制定协议并声明代理方法(方法接口)、代理

#import <UIKit/UIKit.h>
// 第一步:制定协议
@protocol GivenValues <NSObject>
// 并声明代理方法
-(void)giveValuesFromNextPage:(NSString*)name;
@end

@interface SecondViewController : UIViewController
// 第二步:代理
@property(nonatomic,weak)id<GivenValues>delegate;
@end

// - SecondViewController.m

#import "SecondViewController.h"
@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
}

// 第五步:代理传值
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self dismissViewControllerAnimated:YES completion:^{
        if ([self->_delegate respondsToSelector:@selector(giveValuesFromNextPage:)]) {
            [self->_delegate giveValuesFromNextPage:@"代理传值"];
        }
    }];
}

@end

// - ViewController.m:在接受传值的页面中接受协议、且成为代理后,实现代理方法

#import "ViewController.h"
#import "SecondViewController.h"// 需引入头文件
@interface ViewController()<GivenValues>// 第三步:接受协议
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    SecondViewController *secVC = [SecondViewController new];
    secVC.delegate = self;// 指定代理
    [self presentViewController:secVC animated:YES completion:nil];
}

// 第四步:实现传值页面中的代理方法
-(void)giveValuesFromNextPage:(NSString *)name{
    NSLog(@"代理方法触发!name = %@",name);
}
@end

 

posted on 2022-02-20 22:55  低头捡石頭  阅读(32)  评论(0)    收藏  举报

导航