iOS中使用block传值

转自:http://blog.sina.com.cn/s/blog_60b45f230100yiaf.html

用此方法传值可以替代委托了。具体例子:

MainView.h


#import <UIKit/UIKit.h>

@interface MainView : UIViewController
{
IBOutlet UIButton* btn;
IBOutlet UILabel* labShow;
}
-(IBAction)push:(id)sender;
@end

MainView.m


#import "MainView.h"
#import "SecondView.h"

@implementation MainView

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
[super viewDidLoad];
}
-(IBAction)push:(id)sender
{
SecondView *s = [[SecondView alloc] initwithBlock:^(NSString *str){
NSLog(@"%@",str);
labShow.text = str;
}];
[self.navigationController pushViewController:s animated:YES];
[s release];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

SecondView.h


#import <UIKit/UIKit.h>
typedef void (^MyBlock)(NSString *);

@interface SecondView : UIViewController
{
IBOutlet UITextField* txtView;
MyBlock my;
}
-(IBAction)back:(id)sender;
-(id)initwithBlock:(MyBlock)str;
@end

SecondView.m


#import "SecondView.h"

@implementation SecondView

-(id)initwithBlock:(MyBlock)str
{
self = [super init];
if(self)
{
my = str;
}
return self;
}
-(IBAction)back:(id)sender
{
NSString* s = txtView.text;
if(my)
{
my(s);
}
[self.navigationController popViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
-(void)dealloc{
Block_release(my);
[super dealloc];

}
#pragma mark - View lifecycle

- (void)viewDidLoad
{
[super viewDidLoad];
}

- (void)viewDidUnload
{
[super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

界面:




时间: 2024-10-15 15:21:15

iOS中使用block传值的相关文章

IOS中的Block与C++11中的lambda

ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简介过,现在说下ios中的block Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),ret

如何在iOS中使用Block

如何在iOS中使用Block Block可以帮助我们组织独立的代码段,并提高复用性和可读性.iOS4在UIKit中引入了该特征.超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识. Block是什么样的? 你可以使用^操作符来声明一个Block变量,它表示一个Block的开始. int num1 = 7; int(^aBlock)(int) = ^)int num2) { return num1+nunm2; }; 在如上代码中我们将Block声明为一个变量,

iOS中使用block进行网络请求回调

iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael on 2/13/14. // Copyright (c) 2014 EIMS. All rights reserved. // #import <Foundation/Foundation.h> typedef void (^FinishBlock)(NSString *dataString); @

iOS中几种传值的方式

1.ios里面传值的方式很多中现在介绍几种常用的传值方式: 第一种: 属性传值方式: 首先要建两个controller 分别为 RootviewController和 DetailviewController 在Detailviewcontrooler.h实现的代码:(暴露出属性) #import <UIKit/UIKit.h> @interface DetailViewController : UIViewController @property (nonatomic,copy)NSStri

iOS中为什么block用copy属性

1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block).另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Block

ios 中的block应用

在这个大冬天里默默敲着键盘,勿喷.今天学习swift过程中,学习到闭包,发现闭包和oc的block中有很多的相同之处,又重新学习了一下并且学习了一些高级点的用法,内容如下: 1.block格式说明:(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};//如果没有参数,等号后面参数列表的()可以省略 例子: void(^demoBlock)() = ^ { NSLog(@"demo Block"); }; int(^sumBlock)(int, int) = ^(in

IOS中的block 循环引用和retain cycle (经典)

retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个对象的内存计数加1,反之,当我们调用relea

iOS中的block

定义一个block: int (^blockname)(int, int); blockname = ^(int a, int b){ return a>b ? a: b; }; 这个block等同于: int  (^blockname)(int, int) = ^(int a, int b){ return a>b?a:b; }; 使用: NSInterge a = blockname(3, 4); NSLog(@"a=%ld", a); .block作为方法的参数   

深入了解iOS中的VC切换的传值方式

由于上次面试中有提到相关内容,所以这次我专门深入研究了iOS的几种方式: 首先把所有的传值方式都列出来,如果有遗漏,请指正 首先列出iOS中使用的传值方式: init 传值(即在创建VC的时候就对响应的参数进行设置) property 传值(即属性赋值) Router 传值(这个在OC中被使用,因为作者没有写Swift版本,所以先开个坑,估计我会填坑) Delegate 传值(通过协议和代理传值) 闭包(block)传值 (通过swift中的闭包,类似于OC中的block传值) Notifica