iOS 的传值处理(顺逆)
2016-07-19 18:03
411 查看
iOS 的传值处理(顺逆)
博客使用gitbook写的,可能在csdn的MarkDown上有部分不支持;欢迎访问原文:iOS 的传值处理(顺逆)顺传:
将FirstViewController 里面textFiled里面的值传给SecondViewController里面的Label;首先在将FirstViewController里面创建有个textFiled编辑框,并且在里面创建一个按钮(push到SecondViewController创建FirstViewController的按钮
UIButton *button = [[UIButton alloc]init]; button.frame = CGRectMake(100, 100, 200, 100); [button setBackgroundColor:[UIColor blueColor]]; [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];
创建全局的编辑框
@property(nonatomic,strong)UITextField *textFiled; self.textFiled = [[UITextField alloc]initWithFrame:CGRectMake(20, 300, 300, 40)]; self.textFiled.backgroundColor = [UIColor colorWithRed:0.3272 green:0.9068 blue:1.0 alpha:1.0]; [self.view addSubview:self.textFiled];
点击按钮实现跳转
-(void)click{ SecondViewController *pushView = [[SecondViewController alloc]init]; pushView.textString = self.textFiled.text; [self.navigationController pushViewController:pushView animated:YES]; }
在SecondViewController的头文件里面设置一个全局变量,让外部可以访问;
#import <UIKit/UIKit.h> @interface SecondViewController : UIViewController @property(nonatomic,strong)NSString *textString; @end
在.m文件里面创建一个Button点击可以返回FirstViewController并且创建一个Label储存上一界面传入的值:
self.view.backgroundColor = [UIColor lightGrayColor]; UIButton *button = [[UIButton alloc]init]; button.frame = CGRectMake(100, 100, 100, 50); [button setBackgroundColor:[UIColor blueColor]]; [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(20, 200, 100, 40)]; //self.label=label; label.backgroundColor = [UIColor colorWithRed:0.8322 green:1.0 blue:0.2686 alpha:1.0]; label.text = self.textString;// 属性传递得到文本 [self.view addSubview:label];
这样子一个界面编辑的内容就可以传递到第二个界面的Label了;
逆传
界面的逆向传递比较复杂;在这里介绍一种最常用的传值(代理)方式。#####思路:将第三个界面里面textFiled的内容传入第二个界面里面的Label里面显示;
【不多说了,小伙伴叫我去吃饭了,直接上代码】
创建按钮(跳转到第三个界面)
UIButton *button = [[UIButton alloc]init]; button.frame = CGRectMake(100, 300, 100, 50); [button setBackgroundColor:[UIColor orangeColor]]; [button addTarget:self action:@selector(clickthree:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];
在第三个界面ThreeViewController里面创建一个Button和一个textFiled输入框
self.view.backgroundColor = [UIColor orangeColor]; UIButton *button = [[UIButton alloc]init]; button.frame = CGRectMake(100, 100, 100, 50); [button setBackgroundColor:[UIColor blueColor]]; [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; -(UITextField *)textFiled{ if (!_textFiled) { self.textFiled = [[UITextField alloc]initWithFrame:CGRectMake(20, 300, 300, 40)]; self.textFiled.backgroundColor = [UIColor colorWithRed:0.3272 green:0.9068 blue:1.0 alpha:1.0]; [self.view addSubview:self.textFiled]; } return _textFiled; }
到了关键步骤了:
首先在自己要监听的view里面设置代理(这里就在第三个界面里面设置代理)在.h文件里面
#import <UIKit/UIKit.h> @class User; @class ThreeViewController; @protocol ThreeViewControllerDelegate <NSObject> @optional //-(void)addViewController:(ThreeViewController *)addViewContrioller didaddName:(NSString *)name andNumber:(NSString *)number; -(void)addViewController:(ThreeViewController *)addViewContrioller addUser:(User *)User; @end @interface ThreeViewController : UIViewController @property(nonatomic,weak)id<ThreeViewControllerDelegate> delegate; @end
哦。。。差点忘了这里是用的模型,所以先创建一个模型,文件命名为User,将自己要传的数据封装进去。
#import <Foundation/Foundation.h> @interface User : NSObject @property(nonatomic,copy)NSString *name; @end
在ThreeViewController里面让按钮遵循代理跳转(user头文件记得导入)
-(void)click:(UIButton *)sender{ // 判断代理能否响应 // if ([self.delegate respondsToSelector:@selector(addViewController:didaddName:andNumber:)]) { // [self.delegate addViewController:self didaddName:self.textFiled.text andNumber:self.textFiled.text]; // } // if ([self.delegate respondsToSelector:@selector(addViewController:addUser:)]) { User *users = [[User alloc]init]; users.name = self.textFiled.text; [self.delegate addViewController:self addUser:users]; } [self.navigationController popViewControllerAnimated:YES]; }
回到SecondViewController第二个界面里面,首先让它遵守代理(记得导入user头文件)
@interface SecondViewController ()<ThreeViewControllerDelegate>
然后再声明一个可变数组,并且进行懒加载来存放模型数据:
@property(nonatomic,strong)NSMutableArray *users; @implementation SecondViewController - (NSMutableArray *)users{ if (!_users) { _users = [NSMutableArray array]; } return _users; }
在点击调到第三个界面的按钮实现方法里面设置代理
-(void)clickthree:(id)sender{ ThreeViewController *pushView = [[ThreeViewController alloc]init]; pushView.delegate = self; [self.navigationController pushViewController:pushView animated:YES]; }``` 最后调用代理方法拿到数据,这里的因为要把值给label所以要设置一个全局的label来储存内容 ```bash @property(nonatomic,weak)UILabel *label; // 代理,拿到数据 -(void)addViewController:(ThreeViewController *)addViewContrioller addUser:(User *)User{ // NSLog(@"%@__",User.name); [self.users addObject:User]; self.label.text = User.name; } <div class="se-preview-section-delimiter"></div>
以上是在view里面进行传值,如果在UITableView里面进行传值;
一、某一行遵循代理(将后一个界面的值返回前面的某一行)返回昵称,姓名等前面的设置代理不变。主要就在选中跳转的行里面设置该行遵循代理
case 2: { TLNameViewController *pushCell = [[TLNameViewController alloc]init]; // 跳转遵守代理 ** pushCell.delegate = self;** [self.navigationController pushViewController:pushCell animated:YES ]; } <div class="se-preview-section-delimiter"></div>
然后再定义全局的cell来存放传进来的数据
case 2: cell.textLabel.text=@"姓名"; self.namecell=cell; //获取当前传入的cell // cell.detailTextLabel.text=@"修改"; ``` 最后再遵循代理接收数据 ```bash // 获取name数据 -(void)addViewController:(TLNameViewController *)ViewController addUserName:(TLUsers *)name{ [self.users addObject:name]; self.namecell.detailTextLabel.text = name.name; // NSLog(@"__%@",name.name); [self.tableView reloadData]; } <div class="se-preview-section-delimiter"></div>
二、倘若像通讯录一样要全部传入真个tableView;那么要自己定义传入的行数;这个可以根据模型里面接收返回的数据增加;返回自定义的模型的行数
<div class="se-preview-section-delimiter"></div> #pragma tableView代理方法 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.users.count; } <div class="se-preview-section-delimiter"></div>
记得让跳转按钮遵守代理
TLAddPassengerViewController *pushCell5 = [[TLAddPassengerViewController alloc]init]; pushCell5.delegate = self; // 设置代理 [self.navigationController pushViewController:pushCell5 animated:YES ]; <div class="se-preview-section-delimiter"></div>
然后遵循代理接收数据:
// 获取User的数据 -(void)addViewController:(TLAddPassengerViewController *)viewController addUser:(TLUsers *)user { [self.users addObject:user]; [self.tableView reloadData]; } <div class="se-preview-section-delimiter"></div>
最后显示数据:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *ID = @"cell"; UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:ID]; if (!cell) { // 定义cell显示风格 cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } self.cell = cell; cell.backgroundColor =[UIColor colorWithRed:0.950 green:0.971 blue:0.980 alpha:1.000]; //用view来画分割线 UIView *customLine = [[UIView alloc] init]; customLine.frame = CGRectMake(cell.frame.origin.x, cell.frame.origin.y, self.view.frame.size.width+55, 10); customLine.backgroundColor = [UIColor colorWithRed:0.888 green:0.865 blue:0.872 alpha:1.000]; [cell.contentView addSubview:customLine]; // 显示传入数据 TLUsers * user = self.users[indexPath.row]; cell.textLabel.text = user.passName; cell.detailTextLabel.text = user.passID; if (self.cell.detailTextLabel.text.length>7) { [self numberApperStar]; } return cell; <div class="se-preview-section-delimiter"></div>
这样传值就结束了。
有啥问题欢迎留言,希望可以和大家多多交流【处女篇,请多多关照、、、】
附带小功能:
当返回cell里面的数字太长了,或者是身份证手机号等为了加密处理显示前面三位和最后四位,中间均用星号代替:
// 当数字大于7位,中间显示星号 -(void)numberApperStar{ //星号字符串 NSString *xinghaoStr = @""; NSString *idcardNumber = self.cell.detailTextLabel.text; //动态计算星号的个数 for (int i = 0; i < idcardNumber.length - 7; i++) { xinghaoStr = [xinghaoStr stringByAppendingString:@"*"]; } //身份证号取前3后四中间以星号拼接 idcardNumber = [NSString stringWithFormat:@"%@%@%@",[idcardNumber substringToIndex:3],xinghaoStr,[idcardNumber substringFromIndex:idcardNumber.length-4]]; self.cell.detailTextLabel.text = idcardNumber; }
调用方法相信大家都会啦,我就不多写了;
谢谢观看!
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 新注册
- 四大漏洞入侵博客
- c#窗体传值用法实例详解
- C#简单实现子窗体向父窗体传值的方法
- 在Ubuntu系统上安装Ghost博客平台的教程
- ASP.NET页面间的传值的几种方法
- 关于C语言中参数的传值问题
- C# Winform窗口之间传值的多种方法浅析
- 利用ASP.NET MVC+Bootstrap搭建个人博客之修复UEditor编辑时Bug(四)
- php下通过POST还是GET来传值
- JS中Iframe之间传值的方法
- JavaScript实现同一页面内两个表单互相传值的方法
- js传值后台中文出现乱码的解决方法