代理和block反向传值
分类:
IT文章
•
2024-01-03 16:55:42
代理传值:
// SendViewController.h
#import <UIKit/UIKit.h>
@protocol SendInFor <NSObject>
-(void)sendInForIdea:(NSString*)text;
@end
@protocol SendInForTwo <NSObject>
-(void)sender:(NSString*)text;
@end
@interface SendViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,retain)id <SendInFor> delegate;
@property(nonatomic,retain)id <SendInForTwo> delegateB;
@property(nonatomic,retain)NSIndexPath*indexPath;
@e代理
代理方法
#import "SendViewController.h"
//代理传值
@interface SendViewController ()
{
UITableView*table;
NSMutableArray*data;
}
@end
@implementation SendViewController
- (void)viewDidLoad {
[super viewDidLoad];
data=[[NSMutableArray alloc]init];
table=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
table.delegate=self;
table.dataSource=self;
[self.view addSubview:table];
for (int i=0; i<20; i++) {
NSString*string=[[NSString alloc]initWithFormat:@"数据%d",i];
[data addObject:string];
}
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [data count];
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *str=@"str";
UITableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:str];
if (cell==nil) {
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];
}
// cell.selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame];
UIImageView *norImage=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
[norImage setImage:[UIImage imageNamed:@"image"]];
cell.textLabel.text=[data objectAtIndex:indexPath.row];
//点击单元格 变换背景图片
if ([_indexPath isEqual: indexPath]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.backgroundColor=[UIColor redColor];
cell.accessoryView=norImage ;
/* 可以自定义图片 按钮 文本
cell.accessoryType=btn;
cell.accessoryType=label;
*/
}
else{
cell.accessoryType = UITableViewCellAccessoryNone;
cell.backgroundColor=[UIColor whiteColor];
cell.accessoryView=nil ;
}
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.delegate respondsToSelector:@selector(sendInForIdea:)]) {
_indexPath = indexPath;
[self.delegate sendInForIdea:[data objectAtIndex:indexPath.row]];
[table reloadData];
// cell.imageView.image=[UIImage imageNamed:@"2"];
//延迟操作 延迟跳转时间
[self performSelector:@selector(pressBtn) withObject:nil afterDelay:3];
//点击获取的 cell cell变色
// UITableViewCell *cell = [table cellForRowAtIndexPath:indexPath];
// cell.backgroundColor=[UIColor cyanColor];
}
}
-(void)pressBtn
{
[self.navigationController popViewControllerAnimated:YES];
}
具体方法
block反向传值:
// FirstViewController.h
#import <UIKit/UIKit.h>
//直接回车,第一个参数是返回值类型,第二个为重定义的block名称,第三个为要传参数类型和参数名;然后需要定义重定义block类型的属性,并且实现参数为该重定义类型block的方法。
//typedef <#existing#> <#new#>;
//回调不加断点不容易找出错误
typedef void (^BlockColor)(UIColor *color);
typedef void (^BlockTitle)(NSString *title);
@interface FirstViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
//block设置为属性,修饰符用copy,即使使用strong,编译器也会将strong处理成copy
@property(nonatomic,copy)BlockColor color;
@property(nonatomic,copy)BlockTitle Title;
@endblock方法
block方法
// FirstViewController.m
#import "FirstViewController.h"
#import "TableViewCell.h"
//block 反向传值
@interface FirstViewController ()
{
UITableView *table;
NSMutableArray *data;
NSMutableArray *arr;
}
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super viewDidLoad];
arr =[[NSMutableArray alloc]init];
for (int i=0; i<20; i++) {
NSString * str=[[NSString alloc]initWithFormat:@"数据%d",i];
[arr addObject:str];
}
table=[[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
table.dataSource=self;
table.delegate=self;
[self.view addSubview:table];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [arr count];
}
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
TableViewCell *customCell = (TableViewCell *)cell;
[UIView animateWithDuration:2 animations:^{
customCell.image.alpha = 1.0f;
}];
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
TableViewCell *cell=[[[NSBundle mainBundle]loadNibNamed:@"TableViewCell" owner:self options:nil] lastObject];
cell.Title.text=[arr objectAtIndex:indexPath.row];
//xib 中button不要设置点击事件 这样可以在cell里面调取按钮(点击单元格的按钮可以跳转)
cell.button.tag=indexPath.row;
[cell.button addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchUpInside];
cell.image.image =[UIImage imageNamed:@"2"];
cell.image.alpha =0.2f;
return cell;
}
- (void)clickAction:(UIButton *)sender
{
NSInteger tag=sender.tag;
NSLog(@"block 传值");
// __weak typeof(self) weakSelf=self;
if (_Title) {
_Title([arr objectAtIndex:tag]);
}
if (_color) {
_color([UIColor redColor]);
}
[self.navigationController popToRootViewControllerAnimated:YES];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"hello world");
TableViewCell *cell = [table cellForRowAtIndexPath:indexPath];
NSString *string = arr[indexPath.row];
NSLog(@"string=%@",string);
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 70;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
具体方法
// RootViewController.h
#import <UIKit/UIKit.h>
#import "SendViewController.h"
@interface RootViewController : UIViewController<SendInFor>
#import "RootViewController.h"
#import "FirstViewController.h"
#import "SendViewController.h"
@interface RootViewController ()
{
FirstViewController *first;
SendViewController *send;
UIButton *btn;
UIButton *btn1;
}
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title=@"test";
first =[[FirstViewController alloc]init];
send=[[SendViewController alloc]init];
send.delegate=self;
[self creatBtn];
}
-(void)creatBtn
{
btn=[UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(50, 100, 100, 100)];
[btn setBackgroundColor:[UIColor cyanColor]];
[btn setTitle:@"block传值" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(pressBtn) forControlEvents:UIControlEventTouchUpInside];
btn1=[UIButton buttonWithType:UIButtonTypeCustom];
[btn1 setFrame:CGRectMake(200, 100, 100, 100)];
[btn1 setBackgroundColor:[UIColor cyanColor]];
[btn1 setTitle:@"代理传值" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(pressBtn1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
[self.view addSubview:btn1];
}
-(void)pressBtn
{
//int a = 0; block 里面不能改变a的值(报错,block下面打印原来的值),但是可以将a的值赋给别人
//弱引用属性
//弱引用 self
__block __weak typeof(self) weakSelf = self;
__block __weak UIButton *_button = btn;
first.color=^(UIColor *color){
_button.backgroundColor=color;
};
first.Title=^(NSString *title){
weakSelf.navigationItem.title=@"block传值";
//强引用
// [btn setTitle:title forState:UIControlStateNormal];
//弱引用
[_button setTitle:title forState:UIControlStateNormal];
};
[self.navigationController pushViewController:first animated:YES];
}
-(void)pressBtn1
{
[self.navigationController pushViewController:send animated:YES];
}
-(void)sendInForIdea:(NSString *)text
{
[btn1 setTitle:text forState:UIControlStateNormal];
self.navigationItem.title=@"代理传值";
}