将在textField中输入的文字传递给label,简单高效的

2019-09-17 20:25栏目:大奖888官网登录
TAG:

如今,多数爱啪啪都有一键换肤的功能,即便是称呼不一样,但是都做了同样的事情,实现了同样的效果。简单高效的方式就是使用通知,我们就来看一下使用通知是如何实现的~~~简单到爆炸!首先:我们在工程中新建几个控制器,并为每个控制器设置不同的背景颜色。

1、属性传值,OC中中最简单的传值方式。它的使用方法,只需要在推出下一个页面之前,将下一个页面中接受属性在本页面进行赋值即可。在相邻页面之间传值非常方便。

在任何的软件开发中都离不开界面与界面之间的通信,界面通信的最直接的方法就是界面传值.

www.88pt88.com 1工程目录

2、代理传值。使用方式:后传前,即从后一个页面传向前一个页面,与属性传值方式正好相反。它的具体实现过程:首先需要将在将值传递出去的类中实现一个协议,协议中写一个代理传值的具体方法,然后需要在传值的类中设置一个属性,这个属性为一个遵循之前写的协议的id类型。最后在需要使用数据的类中,设置代理,实现代理方法,就可以 拿到从后一个页面传过来的值。进行下一步处理。

在开发过程中我们在页面传值时我们通常使用的方法有:属性传值法,block传值法,代理传值法,以及单例传值法,通知传值法

我们在其中的一个设置页面,进行某一项操作以达到改变所有页面的背景颜色的目的。

3、Plist传值、plist传值这种方式一般比较少用,其基本实现原理:系统在建立好新工程之后会给自己建一个plist文件,里面存储一些关于新工程的初始设置数据。在这个文件的最大特点在于,在这个文件中的所有数据都不会因为重新启动而发生变化,是OC中固化数据的方式之一,但是这个plist文件从工程建立开始便不会因为程序其他部分的设置而改变。

属性传值多用于在将前一个页面的值传到后一个页面去,也就是我们通常说的从前往后传值

- changeColor:(UIButton *)sender { NSLog(@"一键修改背景颜色"); //通知中心发送通知消息 [[NSNotificationCenter defaultCenter]postNotificationName:@"change" object:nil userInfo:@{@"color":[UIColor lightGrayColor]}]; self.view.backgroundColor = [UIColor lightGrayColor];//设置设置页面自身的背景}

4、通知传值、OC中比较方便的一种传值方式,使用方法,在需要数据的界面注册监听,然后在数据提供界面,这样就可以很简单进行传值.例:发送通知代码如下:[[NSNotificationCenter defaultCenter]postNotificationName:@”myNotificationName”object:broadcasterObject];

www.88pt88.com,当第一个页面push到第二个页面的时候,我们在第二个页面声明一个属性用于接受从第一个页面传递过去的值,然后在push这个事件被触发的时候进行赋值,也就是说,先初始化创建第二个控制器,然后通过创建的控制器来访问它所对应的属性,将即将传递的值赋给它,这样就完成了属性传值.于是当页面被push到第二个页面之后我们访问它的属性的时候,也就顺便获取到了传递过来的值.

通知的实现是一对多的关系,我们在设置页面里面发送了通知,相应的要是在别的页面注册通知,只有注册了通知之后,在接收的通知消息的时候就会做出相应的操作。于是,我们在其他各个页面注册通知,并实现其相应方法:

注册接收通知的代码如下:[[NSNotificationCenter defaultCenter]addObserver:listenerObjectselector:@selector(receivingMethodOnListener:)name:@”myNotificationName”object:nil];

例如:现在有两个控制器FirstViewController和SecondViewController.我们在FirstViewController中创建一个UITextFiled,在SecondViewController中创建一个UILabel,然后在textField中输入文字,我们使用导航控制器来控制页面之间的跳转,当我们跳转到第二个页面的时候,将在textField中输入的文字传递给label,作为label上的文字.

- viewDidLoad { [super viewDidLoad]; //注册消息 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeTheme:) name:@"change" object:nil];}-changeTheme:(NSNotification *)sender{ self.view.backgroundColor = sender.userInfo[@"color"];}

优点:通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知的名字可以使任何字符串。

代码如下:

其他所有页面的做法是一样的..这个时候我们在设置页面所做操作之后,就会看到所有的页面背景颜色都改变了。我们的例子只是设置背景颜色,其实利用通知进行别的项目设置也是类似的,咱们有兴趣都可以探讨···

缺点:相较值观察需要多点代码。在删掉之前必须移除监听者,否则会造成内润泄漏。不能传大量数值,只能让谁去做什么事,另外给人的感觉有点效率低。

FirstViewController中:

5、block传值、block传值与观察者模式传值的实现机制比较相似,只是block在整个实现过程中显得更加简单,并且需要实现确定传值的目的地。在观察者传值中,程序员可以在程序实现的整个范围内选择信号什么时候传递,即使多次传递也没有关系。而block传值则是需要将要传递的另一个对象确定下来,更多的是像一个老板固定的给员工分配固定的任务,然后将任务成果拿到之后进行固定的处理。

self.navigationItem.title = @"First";// 设置控制器的背景颜色self.view.backgroundColor = [UIColor yellowColor];// 设置控制器的右按钮,并创建事件点击调到下一页面self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"第二页" style:UIBarButtonItemStyleDone target:self action:@selector];// 创建输入框self.firstTF = [[UITextField alloc] initWithFrame:CGRectMake(50, 100, 314, 40)];self.firstTF.placeholder = @"请输入文字!";_firstTF.borderStyle = UITextBorderStyleLine;[self.view addSubview:_firstTF];

6、观察者传值、观察者传值是一种比较少用的方法,在观察者方法中,程序员可以在某一个视图控制器中设置观察者和该观察者的的标识以及受到观察者信号之后该视图控制器所应该进行的操作。在设置好观察者之后的程序实现中,观察者什么时候接收到相关的信号,就将信号传递给原始 的视图控制器,然后该视图控制器进行相关的操作即可。观察者控制器比较强大的是可以传递很多东西,在很大程度上更像是给设置观察者的对象添加啦一个远程控制器。

SecondViewController中:

7、单例传值、单例传值是一种比较强大的传值方式,它可以在任意两个界面之间进行一些简单的值传递。所谓的单例传值就是在程序实现中新建一个雷、将想要传递的值存储到这样一个类中,之后咋程序的实现过程中想要调用这个值得所有地方都可以通过新建一个单例来取得其中的值。就像是将一个工具放在公用的地方,想要使用工具的对象到放置工具的地方取一下就可以啦,单例传值只是多了一点,那便是每一次有对象取走其中的值后,原地都会留下相同的另外一个值。单例传值的核心实现在于、程序实现过程中第一次调用单例的时候是给单例赋值,之后每一次调用单例对象都是取出单例中的值

self.navigationItem.title = @"Second";self.view.backgroundColor = [UIColor cyanColor];self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:self action:@selector];self.secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 314, 40)];self.secondLabel.backgroundColor = [UIColor orangeColor];// 由上一个页面通过属性传值传过来self.secondLabel.text = _tfString;[self.view addSubview:_secondLabel];

8、数据库、数据库也可用来传值,一般简单的传值一般都会选择以上方式,只用遇到负责数据的时候才会选用数据库传值。

我们在SecondViewController的.h文件中设置一个字符串属性用来接收从FirstViewController中传递过来的值.

@property(nonatomic,strong)NSString *tfString;

那么我们在什么时候传递这个值呢?

合适的地方应该是在第一个页面跳转到第二个页面的时候创建,也就是在push方法执行之前进行传值.我们在FirsrViewController的右按钮点击事件也就是next方法中进行传值.

-next:(UINavigationController *)sender{ ScondViewController *secondNC = [[ScondViewController alloc] init]; // 将第一个界面的输入框信息赋值给第二个页面的Label secondNC.tfString = _firstTF.text; [self.navigationController pushViewController:secondNC animated:YES]; }

这样就实现了从前往后传值,也就是属性传值

代理传值多用于从后往前传值.

我们还是使用上面的额例子,比如我们现在在SecondViewController中进行的相关的操作,现在我们要返回到第一个页面,但是我们现在有一个需求就是需要在SecondViewController中创建一个UITextField,在FirstViewController中创建一个UILabel,当页面pop回第一个页面的时候将SecondViewController中textField中的文字传递到FirstViewController中的label上,这个时候,我们就可以使用代理传值.

我们在SecondViewController的.h中创建一个协议,并且设置代理属性,让其遵循该协议.

代码如下:

// 设置一个协议方法@protocol SecondVCDelegate // 代理传值 - passValue:(NSString *)value;@end

// 声明代理属性进行代理传值@property(nonatomic,weak)id delegate;

在SecondViewController中创建textField

 self.secondTF = [[UITextField alloc] initWithFrame:CGRectMake(50, 200, 314, 40)]; self.secondTF.placeholder = @"请输入"; self.secondTF.borderStyle = UITextBorderStyleLine; [self.view addSubview:_secondTF];

在FirstViewController中创建label并让其遵循协议

#import "FirstViewController.h"#import "ScondViewController.h"@interface FirstViewController ()@property(nonatomic,strong)UILabel *firstLab;@end

创建UILabel

 self.firstLab = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 314, 40)]; self.firstLab.backgroundColor = [UIColor magentaColor]; [self.view addSubview:_firstLab];

我们在上述属性传值代码中已经为SecondViewController的导航控制器设置了右按钮,那么,我们只需要在其触发事件中让代理去执行传值即可.代码如下:

- back:(UINavigationController *)sender{ // 代理去执行传值 [_delegate passValue:_secondTF.text]; [self.navigationController popViewControllerAnimated:YES]; }

然后在FirstViewController的next方法中为SecondNC制定其代理为其自身即可.

实现其代理方法

- passValue:(NSString *)value{ _firstLab.text = value; }

这样我们就可以在第一个页面得到第二个页面的值了.

block的本质就和其他OC中变量类似,只不过,block中存储的数据是函数体,但是在使用block时完全可以像调用其他函数似的,传入参数,然后得到返回值.关于详细的block,在这里就不赘述了.

在iOS开发中我们用到block进行传值的情况多数情况下也是在从后往前传值.所以我们依然使用上述例子.

使用block传值,首先我们需要在SecondViewController中定义并声明block属性.

// 定义有参无返回值的匿名函数typedef void(NSString *);

@interface SecondViewController : UIViewController@property(nonatomic,copy)MyBlock block;@end

同上,我们将SecondViewController中textField中输入的文字传递到FirstViewController中的label上显示.

我们在SecondViewController的back方法中调用block,并且将在这个控制器的textField中的文字作为block的参数传递给block.

- back:(UINavigationController *)sender{ // 代理去执行传值 self.block(_secondTF.text); [self.navigationController popViewControllerAnimated:YES]; }

然后我们在FirstViewController的next方法中,也就是alloc出SecondViewController的时候调用SecondViewController的block,实现传值

- back:(UINavigationController *)sender{ __weak typeoftemp = self; secVC.block = ^(NSString *string){ // 通过回调将传进来的字符串赋值给label temp.firstLab.text = string; }; [self.navigationController popViewControllerAnimated:YES]; }

在上述代码中,因为block里面不能直接使用属性,实例变量和方法(因为会造成循环引用),所以我们重新用__weak修饰self并重新命名为temp.这样我们就实现了传值.

由于单例在内存中只创建一次的并且可以全局访问的属性,我们可以在必要的时候将数据存放在单例的属性中,并且在必要的时候从单例中通过访问其属性进行调用,这样就实现值的传递

首先我们先创建一个单例类DataHandle,在其.h文件中我们使用类方法声明单例创建的方法,并且声明一个字符串属性用来保存值,(因为我们依然使用上述的例子,所以声明字符串,来保存textField中输入的文字,在实际的开发过程中,读者可以自己根据实际情况而定).

@interface DataHandle : NSObject// 创建单例+ (instancetype)sharedDataHandle;@property(nonatomic,strong)NSString *Str;@end

在.m文件中实现其初始化方法

@implementation DataHandle// 声明静态区对象的原因,希望程序运行期间,在内存中一直存在,这样对外界来说,可以随时读取数据static DataHandle *dataHandle = nil;// 创建单例+ (instancetype)sharedDataHandle{ if (nil == dataHandle) { // 我们创建单例使用加号方法的原因是因为,在创建之前,无法存在一个实例对象去调用动态方法来创建它本身 dataHandle = [[DataHandle alloc] init]; } return dataHandle; }@end

无论是从FirstViewController中将textField的值传到SecondViewController的label上还是反过来传值.我们只需要在需要的时候通过其类方法(+ (instancetype)sharedDataHandle)来创建出单例对象来,然后将textField的text属性以赋值的方式赋给单例的Srt属性即可

代码如下:

-next:(UINavigationController *)sender{ DataHandle *dataHandle = [DataHandle sharedDataHandle]; ScondViewController *secondNC = [[ScondViewController alloc] init]; // 将第一个界面的输入框信息赋值给第二个页面的Label dataHandle.Str = _firstTF.text; [self.navigationController pushViewController:secondNC animated:YES]; }

假使在SecondViewController中我们为label的text赋值,而其值就是FirstViewController中在textField中输入的值,那么我们可以这样写:

DataHandle *dataHandle = [DataHandle sharedDataHandle];self.secondLabel.text = dataHandle.str;

如上所述就实现了值的传递.其实单例不知是在两个页面之间进行传递,由于单例的一次创建全局访问的特点,我们可以将值传递到ThreeViewController,FourViewController等等的控制器,相反的也可以反向传递,在此就不在重复了,其实原理都是相同的.

通知在iOS开发中占据着非常重要的地位,通常在两个页面关联不大,但是需要传递信息的时候传递,这样就可以通过通知来实现.

我们新建一个控制器来一键切换所有控制器的背景颜色.我们为其取名为:SettingViewController

创建一个UIButton来控制背景颜色的切换.并且为其设置触发事件在其出发事件中我们发送消息,并且设置通知的name为"change"用来标记通知,设置userInfo,userInfo是一个字典,我们需要将所有控制器的颜色设置为灰色,于是,我们在创建字典的时候其Value值为[UIColor lioghtGrayConlor].

- changeColor:(UIButton *)sender { // 发送消息 [[NSNotificationCenter defaultCenter] postNotificationName:@"change" object:nil userInfo:@{@"color":[UIColor lightGrayColor]}];}

这样当我们点击该button的时候,就发送了一条消息.在其他控制器里,我们设置观察者,注册消息.

// 注册消息 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeTheme:) name:@"change" object:nil];

当收到消息之后,就会执行changeTheme:方法,我们就可在该方法中获取发送的消息中所传递过来的数据,进行控制器背景颜色的改变.

- changeTheme:(NSNotification *)sender{ self.view.backgroundColor = sender.userInfo[@"color"]; }

在所有控制器里都添加观察者注册消息,并且实现changeTheme方法就实现了背景颜色的切换,而sender.userInfo[@"color"]就是从其他控制器中传递过来的值.我们可以改变userInfo这个字典的信息,从而实现其他类型的值的传递.

以上介绍了五种界面通信的方法,由于笔者自身水平有限,其中难免会有疏漏,还请读者指正,如果有不明白的问题,欢迎在评论区留言讨论指教,我将不胜感激,另,转载请注明出处......

版权声明:本文由大奖888-www.88pt88.com-大奖888官网登录发布于大奖888官网登录,转载请注明出处:将在textField中输入的文字传递给label,简单高效的