iOS基础之界面通信

  在这里讲的界面通信有三种:属性传值、协议传值和block传值

  首先我们来讲属性传值,属性传值用于从第一个页面传值到第二个页面,以此类推。

  代码演示:

//一.在第二个视图控制器里声明一个属性contends
@interface SecondViewController:UIViewController
@property(nonatomic,copy)NSString *contents;
@end

//二.在点击FirstViewController按钮的方法里给SecondViewControoler的contents属性赋值
- (void)buttonAction:(UIButton *)button{
  SecondViewController *secondVC = [[SecondViewController alloc]init];
secondVC.contents =se;f.label.text;
[self.navigationController pushViewController:secondVC animated:YES];  
}

//三.在SecondViewController使用contents属性给textField赋值
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(85,200,200,40)];
self.textField.placeholder=@"请输入内容";
self.textField.text = self.contents;
[self.view addSubview:self.textField];
}

  接下来是协议传值:

  1.声明协议

  2.声明代理

  3.执行协议方法

  4.签订协议

  5.指定代理

  6.实现协议方法

  

//  .h 内部的声明部分  (即:fourthController )

//1 声明协议

//UI中的协议名称为,当前类名 + Delegate

@protocol FourthViewControllerDelegate <NSObject>

 //不加说明:默认是必须实现的方法

- (void)pushValue:(NSString *)text uicolor:(UIColor *)color;

@end 

@interface FourthViewController : UIViewController 

//2 声明协议的代理对象

@property (nonatomic, assign)   id <FourthViewControllerDelegate>  delegate;//代理对象

@end

 
// .m 内部的实现

// 3, 执行协议的方法   (写在具体需要传值的方法内部)

if (self.delegate != nil && [self.delegate respondsToSelector:@selector(pushValue: uicolor:)] ) {  //代理不为空  代理内容接受
        [self.delegate pushValue:self.field.text uicolor:self.view.backgroundColor];//代理执行此方法,并且此时实现需要传的值
    }
// 接收传值的内部 的   实现部分
// 4 接受代理

@interface ThirdViewController : UIViewController<FourthViewControllerDelegate>

// 5 指定代理对象为当前的视图控制器

fourthController.delegate = self;

// 6 实现声明的协议方法

//6 实现协议方法(写在当前视图控制器的  .m  内部)

 

- (void)pushValue:(NSString *)text uicolor:(UIColor *)color{    

    self.label.text = text;

    self.view.backgroundColor = color;

}

  

  最后是Block传值:

  block是匿名函数,能够实现函数回调功能,用于页面之间通信,同时可以进行传值。

  演示代码:

  

#import <Foundation/Foundation.h>
typedef void (^String)(NSString *); 
@interface AppTool : NSObject 
- (void)sendNumber:(NSInteger)number andBlock:(String)block;//Block类型作为参数使用 

@end


// .m 实现内容

#import "AppTool.h" 

@implementation AppTool 

- (void)sendNumber:(NSInteger)number andBlock:(String)block{    

    NSString *string = [NSString stringWithFormat:@"%ld",number];//把数值转化为字符串

    block(string);//把字符作为Block的参数

}

@end


   //首先实例化一个对象

    AppTool *tool = [[AppTool alloc] init];

    //使用声明好的方法,实现赋值

    [tool sendNumber:10086 andBlock:^(NSString *str) {
        self.label.text = str;
    }];

 

//SecondController的内部的写法

//   .h  内部的声明

typedef void (^StringC)(NSString *,UIColor *);//冲定义

@interface SecondViewController : UIViewController

@property (nonatomic, copy) StringC stringC;//一定要使用 copy

@end

//   .m  内部

 //和协议的使用相似

    if(self.stringC != nil){

        self.stringC(self.field.text,self.view.backgroundColor);//传值是 field的内容和背景颜色。。和函数的使用相似

    }

2.2  具体的实现赋值(在接收数值的界面 实现Block)

secondController.stringC = ^(NSString *str, UIColor *color){  

        self.label.text = str;

        self.view.backgroundColor = color;

    }; //实现了传值给 self 的内部控件 

 

  对比协议传值和Block传值,两者也有很多相似之处。

原文地址:https://www.cnblogs.com/16-jkd/p/5205353.html