2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
- ( void )viewDidLoad {
[super viewDidLoad];
// static const char associatedButtonkey; UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@ "点我" forState:UIControlStateNormal];
[self.view addSubview:btn];
[btn setFrame:CGRectMake(50, 50, 50, 50)];
btn.backgroundColor = [UIColor redColor];
[btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
// Do any additional setup after loading the view, typically from a nib.
} -( void )click:(UIButton *)sender
{ NSString *message = @ "你是谁" ;
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@ "提示" message:@ "我要传值·" delegate:self cancelButtonTitle:@ "确定" otherButtonTitles:nil];
alert.delegate = self;
[alert show];
//#import <objc/runtime.h>头文件
//objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。
//1 源对象alert
//2 关键字 唯一静态变量key associatedkey
//3 关联的对象 sender
//4 关键策略 OBJC_ASSOCIATION_ASSIGN
// enum { // OBJC_ASSOCIATION_ASSIGN = 0, 若引用/**< Specifies a weak reference to the associated object. */ // OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. // * The association is not made atomically. */ // OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. // * The association is not made atomically. */ // OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. // * The association is made atomically. */ // OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. // * The association is made atomically. */ // }; objc_setAssociatedObject(alert, @ "msgstr" , message,OBJC_ASSOCIATION_ASSIGN);
//把alert和message字符串关联起来,作为alertview的一部分,关键词就是msgstr,之后可以使用objc_getAssociatedObject从alertview中获取到所关联的对象,便可以访问message或者btn了
// 即实现了关联传值 objc_setAssociatedObject(alert, @ "btn property" ,sender,OBJC_ASSOCIATION_ASSIGN);
} -( void )alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{ //通过 objc_getAssociatedObject获取关联对象
NSString *messageString =objc_getAssociatedObject(alertView, @ "msgstr" );
UIButton *sender = objc_getAssociatedObject(alertView, @ "btn property" );
NSLog(@ "%ld" ,buttonIndex);
NSLog(@ "%@" ,messageString);
NSLog(@ "%@" ,[[sender titleLabel] text]);
//使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。
} 终端打印: 2015-07-22 16:18:35.294 test[5174:144121] 0 2015-07-22 16:18:35.295 test[5174:144121] 你是谁 2015-07-22 16:18:35.295 test[5174:144121] 点我 |