block作为苹果主推的方法,同样是可以用来传值的。
两个页面,第一个页面有一个label,第二个页面有一个textField,将第二个页面输入的信息,在第一个页面显示。
按照代码中的步骤,并附有说明,应该很容易懂了。
第二个页面controller的.h文件(声明block)
#import <UIKit/UIKit.h> #pragma mark - 1.typedef一个block方便后面使用 typedef void(^PassValue)(NSString *text); @interface SecondViewController : UIViewController #pragma mark - 2.声明一个block属性(一定要用copy) @property(nonatomic, copy)PassValue passValue; @end
第三步在第一个页面的controller的.m文件中(给block赋值)
第一个页面调到第二个页面的button的响应事件
- (void)doTapButton:(UIBarButtonItem *)barButtonItem { SecondViewController *secondVC = [[SecondViewController alloc] init]; #pragma mark - 3.给下一个页面的block属性赋值;即将block的参数给自己的UILabel的text用于显示 secondVC.passValue = ^(NSString *text){ ((UILabel *)self.view.subviews[0]).text = text; }; [self.navigationController pushViewController:secondVC animated:YES]; [secondVC release]; }
第四步,也是最后一步在第二个页面的.m中(什么时候执行block)
#pragma mark - 4.页面消失的时候执行前一个页面传过来的block值 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (self.passValue != nil) { // 将自己页面的textField的text作为参数传过去 self.passValue(((UITextField *)self.view.subviews[0]).text); } }
!!还有一个注意的事件就是block的释放(苹果专门为block提供了释放方法)
- (void)dealloc { #warning Block释放 Block_release(_passValue); [super dealloc]; }