属性传值,协议传值,block传值,单例传值四种界面传值方式

时间:2022-09-15 16:01:18

一、属性传值

对于属性传值而言,相对于其它的三种 方法来说,是最基础,最简单的一种 方法,但,属性传值 有很大的局限性,因为是适用于第一个界面向第二个界面传 值,第二个向第三个界面传值等等。N界面向N + 1界面传值。而在此基础上,必须知道跳转界面的明确位置及所要传的值的具体类型。在第二个界面中声明所要传值 类型的属性。

@interface SecondViewController : UIViewController

//声明一个字符串属性来保存第一个界面传过来的字符串内容
@property (nonatomic, copy)NSString *string;
@property (nonatomic, copy)UIColor *color;
@property (nonatomic, retain)UILabel *label;

当然,在第二个界面中使用所声明的属性

- (void)viewDidLoad {
[super viewDidLoad]; self.view.backgroundColor = _color;
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(, , , );
[button setTitle:self.string forState:UIControlStateNormal];

在属性传值 的时候,需要知道明确跳转的位置及所要传的值的类型。

@implementation FirstViewController

- (void)right{
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.string = self.textField.text;
secondVC.color = self.view.backgroundColor;
[self.navigationController pushViewController:secondVC animated:YES];
}

二、协议传值

通常,协议传值可以和属性传值一起使用,属性传值是从前往后依次传值,而协议 是从后往前来传值。

协议传值可以简单的分为六步来实现。

1.声明协议 2.声明代理  3.执行协议方法  4.接收协议  5.设置协议 代理对象 6.实现协议方法

//1.声明协议
@protocol FourViewControllerDelegate <NSObject>
- (void)change:(NSString *)string;
- (void)changeColor:(UIColor *)color; @end @interface FourViewController : UIViewController @property (nonatomic, retain)UITextField *textField;
//2.声明代理
@property (nonatomic, assign)id<FourViewControllerDelegate>fouDelegate; @end
@implementation FourViewController

- (void)back{
//3.执行协议方法
if (self.fouDelegate != nil && [self.fouDelegate respondsToSelector:@selector(change:)]) {
[self.fouDelegate change:self.textField.text];
[self.fouDelegate changeColor:self.view.backgroundColor];
} [self.navigationController popViewControllerAnimated:YES]; }

而如果想要使用协议,而必须要接收协议

//5.接收协议
@interface ThreeViewController : UIViewController<FourViewControllerDelegate> @property (nonatomic, retain)UILabel *label; @end
 @implementation ThreeViewController

 //6.实现协议方法
- (void)change:(NSString *)string{
self.label.text = string;
}
- (void)changeColor:(UIColor *)color{
self.view.backgroundColor = color;
}
-(void)button{
FourViewController *fourVC = [[FourViewController alloc] init];
//4.指定第二个界面的代理对象为第一个视图控制器
fourVC.fouDelegate = self;
[self.navigationController pushViewController:fourVC animated:YES];
}

三、block传值

相比于前两种来说,应该知道,block是匿名函数。既然是函数,也就会有那四种 表现形式,无参无返回值,有参无返回值,有参无返回值,有参有返回值这四种 形式。所以 block相对于前两种来说,表现方式 多样。

     __block int a = ;
void (^block1)(void) = ^(void){
a ++;
NSLog(@"%d",a);
};
block1(); void (^block2)(int age, NSString *string) = ^(int age, NSString *string){
NSLog(@"age is %d, text is %@", age, string);
};
block2(, @"xiaoming"); NSString *(^block3)(void) = ^(void){
return @"有参wu返回值";
};
NSLog(@"block3 is %@", block3());
NSString *(^block4)(NSString *text) = ^(NSString *string){
return [string stringByAppendingString:@"有返回值"];
};
NSLog(@"block4 is %@",block4(@"有参有返回值"));

block和协议传值的作用类似,但不同于协议传值的繁琐,block有很好的操作性。

在第二个界面声明block

#import <UIKit/UIKit.h>

typedef void (^BaDaBlock)(NSString *);

typedef void (^colorBlock)(UIColor *);

@interface SecondViewController : UIViewController

@property (nonatomic, retain)UITextField *textField;

@property (nonatomic, copy)BaDaBlock bada;
@property (nonatomic, copy)colorBlock cBlock; @end

Block声明成属性,一定要用copy
因为Block存储的内容在栈区,用copy复制一份到堆区,不能用retain的原因是,retain只能使堆区中的引用计数加1,而不能使栈区的引用计数加1

在第二个界面执行所声明的blcok方法

@implementation SecondViewController
- (void)back{
//执行Block if (self.bada != nil ) {
self.bada(self.textField.text);
} if (self.cBlock != nil) {
self.cBlock(self.view.backgroundColor);
}
[self.navigationController popViewControllerAnimated:YES];
}

Block专门释放的方法  Block_release(_bada);

Block_release(_cBlock);

使用在第一个界面使用block

@implementation FirstViewController

- (void)button{
SecondViewController *secondVC = [[SecondViewController alloc] init];
secondVC.bada = ^(NSString *str){
self.label.text = str;
};
secondVC.cBlock = ^(UIColor *color){
self.view.backgroundColor = color;
};
[self.navigationController pushViewController:secondVC animated:YES];
[secondVC release];
}

四、单例传值

单例,简单的来说,就是单个的实例对象,不管被创建多少次,都具有唯一性,只有惟一的一个。

单例的使用范围不限定,但需要知道明确跳转的位置,和所需传值 的类型。

而单例 ,系统内部也有定义,像UIScreen, UIDevice都是系统内部定义 的单例,而通常使用的则是用户自定义的单例

#import <Foundation/Foundation.h>

@interface Handler : NSObject

@property (nonatomic, copy)NSString *string;

//单例方法是类方法,返回值类型为instancetype
//自己定义的单例类,方法名通常都以share开头
+(instancetype)shareInstance; @end

实现所声明的单例方法

#import "Handler.h"

static Handler *handler = nil;
@implementation Handler +(instancetype)shareInstance{
//加锁,保证创建过程在同一时间内只能允许一个线程对象访问
@synchronized(self){
if (nil == handler) {
handler = [[Handler alloc]init];
}
}
return handler;
} @end

在实现的声明的单例方法时,一定要确保所创建的单例是唯一的。

在实现跳转的地方创建单例,将值赋给单例类声明的属性。

- (void)getAction{
TwoViewController *twoVC = [[TwoViewController alloc] init]; //创建单例
Handler *handler = [Handler shareInstance];
handler.string = _textField.text; [self.navigationController pushViewController:twoVC animated:YES];
}

使用传过来的单例值

@implementation ThreeViewController

- (void)viewDidLoad {
[super viewDidLoad]; Handler *handler = [Handler shareInstance];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
label.text = handler.string;

注意:

因为单例可以全局使用,非常方便,并且唯一性。那怎么不大量使用呢?当然不能大量使用,因为是全局可以使用,相当于static一样,一旦创建,将不能被系统进行回收,所以 这块内存区域会一直存在,直到程序退出,如果大量采用单例的话,会造成大量的内存空间浪费。可以 使用,但不能大量的使用。

属性传值,协议传值,block传值,单例传值四种界面传值方式的更多相关文章

  1. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

  2. iOS传值方式:属性,代理,block,单例,通知

    正向传值均可,反向传值除属性传值不可,其余均可.下面简单介绍: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers ...

  3. swift实现单例的四种方式

    单例模式 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 当你只需要一个实例的时候需要使用单例 ...

  4. iOS页面间传值的方式 (Delegate&sol;NSNotification&sol;Block&sol;NSUserDefault&sol;单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)   iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...

  5. iOS页面间传值的五种方式总结(Delegate&sol;NSNotification&sol;Block&sol;NSUserDefault&sol;单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNot ...

  6. 页面之间传值方式的总结&comma;五种方式&comma;通知&comma;block&comma;代理&comma;单例&comma;NSUERDEFALUT&comma;

    首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...

  7. 【转】iOS页面间传值的方式(Delegate&sol;NSNotification&sol;Block&sol;NSUserDefault&sol;单例)-- 不错

    原文网址:http://www.cnblogs.com/JuneWang/p/3850859.html iOS页面间传值的方式(NSUserDefault/Delegate/NSNotificatio ...

  8. iOS单例的两种实现

    单例模式算是开发中比较常见的一种模式了.在iOS中,单例有两种实现方式(至少我目前只发现两种).根据线程安全的实现来区分,一种是使用@synchronized,另一种是使用GCD的dispatch_o ...

  9. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...

随机推荐

  1. 同比 VS 环比

    同比(YoY=year on year):与历史同时期比较,例如2014年7月份与2013年7月份相比,叫同比 环比(MoM=month on month):是本期统计数据与上期比较,例如2014年7 ...

  2. js异步编程技巧一

    异步回调是js的一大特性,理解好用好这个特性可以写出很高质量的代码.分享一些实际用的一些异步编程技巧. 1.我们有些应用环境是需要等待两个http请求或IO操作返回后进行后续逻辑的处理.而这种情况使用 ...

  3. EL表达式杂项

    1.<%@ page isELIgnored="false" %> 是否忽略EL表达式,如果值为ture,那么  ${..}这样的会直接原样输出,不会进行EL表达式计算 ...

  4. mysql-开启慢查询&amp&semi;所有操作记录日志

    在运营网站的过程中,可能会遇到网站突然变慢的问题,一般情况下和 MySQL 慢有关系,可以通过开启慢查询,找到影响效率的 SQL ,然后采取相应的措施.下面介绍一下如何开启慢查询: 1.开启慢查询 找 ...

  5. OC — &lpar;Foundation框架-NSDate&rpar;

    NSDate:是OC中处理日期时间的一个类,可以用来表示时间 获取当前的时间 NSDate *d = [NSDate date]; 创建日期时间对象 NSLog输出是当前时间 格林时间 格式化显示时间 ...

  6. 掌握Redmine

    一个带有建议.技巧和最佳实践的全面指导和易懂易学的结构. 掌握Redmine 版权©2013 Packt出版 前言(略) 1.熟悉Redmin 我们尝试去做一个新的网站应用程序的时候,回去询问一些了解 ...

  7. Git保存密码

    TortoiseGit中,通过https方式连接时,默认是不会保存帐号密码,需要我们每次输入一次,真心很麻烦! 通过简单的设置,就可以解决这一问题! 编辑仓库目录中本地的”.git/config”文件 ...

  8. iOS--------坐标系统&lpar;UIView的frame、bounds跟center属性&rpar;

    1.概要翻开ios官方开发文档,赫然发现上面对这三个属性的解释如下: frame:描述当前视图在其父视图中的位置和大小. bounds:描述当前视图在其自身坐标系统中的位置和大小. center:描述 ...

  9. 获取网络IP地址

    IPHostEntry iphost = Dns.GetHostEntry(txtDNS.Text);//解析并返回IPHostEntry对象 foreach (IPAddress ip in iph ...

  10. CSS border三角、圆角图形生成技术简介

    http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题, ...