我想用Objective-C动态声明/创建20个方法。这些方法将添加到动作侦听器中。这些方法的实现几乎相同,只会有一些差异。但我不想写这些方法20次。我知道如何将方法块存储到数组中,但是我无法将这些方法传递给动作侦听器。这就是我所拥有的:
NSMutableArray *arr = [NSMutableArray new];
[arr addObject:^(){NSLog(@"my block");}];
id (^ myblock)() = [arr objectAtIndex:0];
sel_registerName("myblock");
[numPad addTarget:self action:@selector(myblock) forControlEvents:UIControlEventTouchUpInside];
注意动作参数需要一个选择器,但是我收到一个错误,因为@selector里面的'myblock'不会返回任何内容,因为'myblock'还没有被声明。
有没有人有解决方案?
答案 0 :(得分:1)
如果你真的,真的需要在运行时创建目标/操作目标,最简单的解决方案是使用NSBlockOperation
。 E.g。
NSMutableArray *blockOperations = [NSMutableArray new];
for(int i = 0; i < 20; i++) {
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"I am listener %d", i);
}];
[blockOperations addObject:blockOperation];
[numPad addTarget:blockOperation action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
}
虽然如果您的目标被称为numPad
,您可能想要做的是将所有单个按钮连接到相同的目标,并为它们提供代表其值的标记。 E.g。
- (void)numPadButtonAction:(UIView *)sender {
NSLog(@"user pressed button with tag %@", @(sender.tag));
}