block的传值和使用

block的传值

1.第一页中声明一个block,需要传入一个颜色,让当前的view变色

//声明一个block,需要传入一个颜色,让当前的view变色

void(^changeColor)(UIColor *color) = ^(UIColor *color){

self.view.backgroundColor = color;

};

2. 第一页中//block传值---------将block给第二个页面

SecondViewController *secondVC = [[SecondViewController alloc] init];

//block传值---------将block给第二个页面

secondVC.block = changeColor;

3.第二页中定义--当block变量作为一个类的属性,必须要使用copy修饰

//block传值---------将block给第二个页面

//block传值 ---当block变量作为一个类的属性,必须要使用copy修饰

@property (nonatomic , copy)void(^block)(UIColor *color);

4.在第二页中给block传值

//block传值---------将传值给block

NSArray *array = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor cyanColor], [UIColor greenColor], [UIColor brownColor], nil];

self.block([array objectAtIndex:rand() % 4]);

类和文件

AppDelegate.m

#import "AppDelegate.h"
#import "MainViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    MainViewController *mainVC = [[MainViewController alloc] init];
    UINavigationController *navVc = [[UINavigationController alloc] initWithRootViewController:mainVC];
    self.window.rootViewController = navVc;
    //模糊效果
    navVc.navigationBar.translucent = YES;
    [navVc release];
    [mainVC release];
    
    
    
    
    [_window release];
    return YES;
}
- (void)dealloc
{
    [_window release];
    [super dealloc];
}
- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end

MainViewController.m

#import "MainViewController.h"
#import "SecondViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"block传值";
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(120, 100, 80, 30);
    button.backgroundColor = [UIColor magentaColor];
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [button setTitle:@"按钮" forState:UIControlStateNormal];
    button.layer.cornerRadius = 5;
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}
- (void)buttonClicked:(UIButton *)button
{
    //block语法
    //返回值类型 (^block参数名) (参数类型 参数名) = ^返回值类型 (参数类型 参数名) {
        //具体实现;
    //};
    
     float b = 0;
    
    //1.无参数无返回值
    void(^block1)(void) = ^(void){
        NSLog(@"可口可乐");
    };
    //block语法调用
    block1();
    
    
    //2.有参数,无返回值
    void(^block2)(NSString *str1, NSString *str2) = ^void(NSString *str1, NSString *str2){
        NSString *a =  [str1 stringByAppendingString:str2];
        NSLog(@"%@", a);
    };
    block2(@"abc",@"def");
    
    
    //3.有返回值,无参数
    NSString *(^block3)(void) = ^NSString *(void){
        return @"咿呀咿呀呦";
    };
    NSLog(@"%@",block3());
    //4.有参数,有返回值
    NSString *(^block4)(NSString *str1) =^NSString *(NSString *str1){
        return [str1 stringByAppendingString:@"真棒!!!!"];
    };
    NSLog(@"%@", block4(@"苹果电脑"));
    
    //声明一个block,需要传入一个颜色,让当前的view变色
    void(^changeColor)(UIColor *color) = ^(UIColor *color){
        self.view.backgroundColor = color;
    };
    //block传值------------声明一个
    void(^changeValue)(UITextField *textField) = ^void(UITextField *textField){
        [button setTitle:textField.text forState:UIControlStateNormal];
    };
    NSLog(@"%@", block1);  //block的地址在全局区
    NSLog(@"%@", changeColor);   //如果在block的代码中,使用了block外部的变量,系统会把block指针转移到栈区
    
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    //block传值---------将block给第二个页面
    secondVC.block = changeColor;
    secondVC.blockofValue = changeValue;
    secondVC.name = button.currentTitle;
    NSLog(@"%@", button.currentTitle);
    NSLog(@"%@", secondVC.block);   //使用copy后block会被系统转移到堆区
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/
@end

SecondViewController.h

#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
//block传值---------将block给第二个页面
//block传值 ---当block变量作为一个类的属性,必须要使用copy修饰
@property (nonatomic , copy)void(^block)(UIColor *color);
@property (nonatomic , copy)void(^blockofValue)(UITextField *textField);
//
@property (nonatomic , copy)NSString *name;
@end

SecondViewController.m

import "SecondViewController.h"
@interface SecondViewController ()
@property (nonatomic , retain)UITextField *textField;
@end
@implementation SecondViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    self.textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 100, 220, 30)];
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    //
    self.textField.text = self.name;
    NSLog(@"%@",self.name);
    self.textField.clearButtonMode = UITextFieldViewModeAlways;
    [self.view addSubview:self.textField];
    [_textField release];
    
    
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 180, 120, 30)];
    button.backgroundColor = [UIColor cyanColor];
    [button setTitle:@"点击" forState:UIControlStateNormal];
    button.layer.cornerRadius = 5;
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}
- (void)buttonClicked:(UIButton *)button
{
    //block传值---------将传值给block
    NSArray *array = [NSArray arrayWithObjects:[UIColor yellowColor], [UIColor cyanColor], [UIColor greenColor], [UIColor brownColor], nil];
    self.block([array objectAtIndex:rand() % 4]);
    //block传值---------将传值给block
    self.blockofValue(self.textField);
    [self.navigationController popToRootViewControllerAnimated:YES];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/
@end
时间: 2024-10-26 08:35:33

block的传值和使用的相关文章

代理和block反向传值

代理传值: // SendViewController.h #import <UIKit/UIKit.h> @protocol SendInFor <NSObject> -(void)sendInForIdea:(NSString*)text; @end @protocol SendInForTwo <NSObject> -(void)sender:(NSString*)text; @end @interface SendViewController : UIViewC

关于block的传值

#import <UIKit/UIKit.h> @interface BViewController : UIViewController @property(nonatomic,strong)void (^ returnStr) (NSString *str); - (void)returnStr:(void (^) (NSString *str))str; @end 1.首先要更正自己的一个观点,属性为block函数是能够被strong修饰的(自己不知道怎么搞的,一直以为其职能被assig

block的传值简单示例仅供参考,大牛勿喷

#import "ViewController.h" typedef void(^sumBlock)(int s);//声明为一个类型; /** *  用声明的block类型 sumBlock 定义block变量 s,s当做方法sum的一个参数, * *  这样在sum的方法实现里面给这个block变量s的参数传值,这个值就可以在调用 sum方法的地方通过这个block的参数值拿到在sum实现内传递的值 */ - (void)sum:(int)a :(int)b :(sumBlock)

ios开发的block反向传值

block 的反向传值,一直以来都是copy, 今天写出来用来加深印象, 也给一些懒哥们copy的方便些.不多说,直接上代码. #import <UIKit/UIKit.h> //第一步(第二个页面.h) typedef void (^secondVcBlock)(NSString*); @interface SecondViewController : UIViewController //第二步(第二个页面.h)声明一个属性 @property(nonatomic,copy)secondV

Block控制器传值和内存泄漏

(1)Block是C语言的,是一种数据类型.Block出现后,很多代理都会被替代.Block是一种数据类型,是提前准备好的代码段,在需要的时候执行.其实就像调用一个函数一样.准备代码就是{},执行就是(); (2)Block常见问题: *在定义Block时,如果引用了外部变量,会对外部变量做一次copy,记录住定义block时候变量的值,如果后续这个变量变了,也不会影响block的变化,这一瞬间是几就是几 *默认情况下不允许Block修改外部变量,因为拷贝是const拷贝.因为Block可以当一

block 页面传值小结

我以自己项目中的一个模块为例,首先有两个页面,第一个页面为显示城市页面,第二个页面为选择要使用block传的值(城市名). 第一个页面中的显示控件: //自定义左部定位视图 self.locView = [[LocationView alloc] initWithFrame:CGRectMake(0, 0, SCREENWIDTH/2-35, 25)]; self.locView.imgView.image = [UIImage imageNamed:@"around"]; UITap

iOS 代理与block 逆向传值 学习

一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己处理一下了,之前也在网上看了一下关于如何选择代理.block 或者通知中心.个人感觉代理和通知中心都比较简单,block稍为有点复杂.代理大家都会用,所以当时就选用了通知中心来处理.之后有一次公司的网实在太差了,出现了逆传数据失败的情况,引起了我的注意,打上断点之后才发现,通知中心的那个方法完全没有

block 页面传值

Block 传值 .h typedef void(^CountBlock)(NSIntegerfigure); -(void)CountWithFigureBlock:(CountBlock)figureBlock; .m CountBlock cBlock; #pragma mark - 块传值调用的方法 -(void)CountWithFigureBlock:(CountBlock)figureBlock { cBlock=figureBlock; } 块的使用 InCashViewCont

IOS Block 反向传值

1.在需要像上一个界面传值的.h 文件实现代理方法 @property (nonatomic, copy) void(^isOpenHandler)(BOOL) ; 2.在执行操作的时候需要江操作的结果反向传值给上个界面的时候调用Block if (self.isOpenHandler) { self.isOpenHandler(YES); } 3.在第一个视图控制器中 Push 的时候调用Block   接受回传回来的值 WM.isOpenHandler = ^(BOOL isopen){ i