回顾了一下以前讲的Block传值,当时讲的时候,就云里雾里的,也没用仔细看过,今天把原来的项目拿出来看了看,稍微自己总结了一下!
传值主要分为两个部分:1.往后传值,也就是说push;2.往前传值,也就是pop。
前者比较简单,用的地方也比较多,尤其在网络请求的时候,直接传值,而无需在第二个界面里面进行重复传值(我以前的时候费过这样的劲,在团购的项目里面,结果模拟器很卡);后者也是用的很多,而且容易出错的地方。
这时候,我们应该理清思路,切忌慌张。任何问题仔细分析开来,也就是我们熟悉的东西。
老师讲课的时候,用的是stotyBoard。思路很清晰。
我们讲storyboard的方法
============== StoryBoard ================
这个是设计好的storyBoard的界面图。所有的控件都是拖过来的。
这是文件夹的内容。下面是设计的步骤
1.拖入一个UINavigationController,并且把第一个ViewController设置为rootViewController。这样,首先显示的就是第一个ViewController了。
2.在两个界面里面,分别拖入三个控件。UILabel、UITextField、UIButton,排版可以根据自己的喜好。
3.分别给它们添加方法
(一)在第一个界面里面
(1)UILabel
@property (retain, nonatomic) IBOutlet UILabel *myLabel;//用来显示第二个界面传递过来的值
(2)UITextField
@property (retain, nonatomic) IBOutlet UITextField *TransitToTheSecond;//用来在第一个界面里面输入代码,在第二个界面里面进行显示
(3)UIButton
- (IBAction)tap:(UIButton *)sender;//用来推送到下一个界面
(二)在第二个界面里面
(1)UILabel
@property (retain, nonatomic) IBOutlet UILabel *DisplayTheVC;
(2)UITextField
@property (retain, nonatomic) IBOutlet UITextField *myTextField;
(3)UIButton
- (IBAction)TapToBack:(id)sender;
(4)添加一个字符串,用来接收上一个界面传递过来的UITextField的值
@property(nonatomic, retain)NSString * str;
(5)文章的重点,添加Block语句
• 在@interface前面,声明block语句
typedef void (^SecondVCBlock)(NSString * str);
• 声明属性
{
SecondVCBlock secondVCBlock;
}
• 在函数声明里面,声明Block语句的设置方法(这个不太明白)
-(void)setSecondVCBlock:(SecondVCBlock)aBlock;
4.既然.h文件都写完了,那么我们就开始在.m中进行填充
(一)在第一个界面里面的.m文件里面,将事件触发的事件都写明白
(1)引入第二个界面的头文件
#import "SecondViewController.h"
(2)写storyBoard的seague文件
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
SecondViewController * secondVC = segue.destinationViewController;
secondVC.str = self.TransitToTheSecond.text; //将本界面中的UITextField的内容赋给第二个界面;在第二个界面没有设置完成时,
这里是没有智能提示的
//改变自己Label的值
[secondVC setSecondVCBlock:^(NSString *str) {
self.myLabel.text = str;
}];
}
(3)写button的触发事件
- (IBAction)tap:(UIButton *)sender {
SecondViewController * secondVC = [[[SecondViewController alloc]init]autorelease];
[self.navigationController pushViewController:secondVC animated:YES];
}
(二)第一个界面填满了,开始写第二个界面的.m。因为第二个界面设计到往回传值,所以,方法要相对麻烦一些。
(1)ViewDidLoad方法,将上一个界面的UITextField的值显示出来
- (void)viewDidLoad
{
[super viewDidLoad];
self.DisplayTheVC.text = self.str;//这时候,第二个界面的UILabel就可以显示第一个界面的字符串了
}
(2)写返回按钮触发的方法,这里面涉及到了Block
- (IBAction)TapToBack:(id)sender {
if (secondVCBlock) {
NSString * str = self.myTextField.text;
secondVCBlock(str);
}
[self.navigationController popToRootViewControllerAnimated:YES];
}
(3)Block的传值方法(我也不太明白)
-(void)setSecondVCBlock:(SecondVCBlock)aBlock{
if (secondVCBlock != aBlock) {
Block_release(secondVCBlock);
secondVCBlock = Block_copy(aBlock);
}
}