IOS Block传值

  回顾了一下以前讲的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);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值