我以编程方式添加UIButton (self.button
是我的属性UIButton
):
self.button = [[UIButton alloc] initWithFrame:CGRectMake(139, 366, 42, 34)];
[self.button addTarget:self action:@selector(buttonPressed:completion:) forControlEvents:UIControlEventTouchUpInside];
我以编程方式调用按钮目标,我还希望框架在用户按下按钮时调用目标。
目标选择器:
-(void)buttonPressed:(UIButton*)sender completion:(void (^)())completionBlock;
第二个参数是一个块。
当我试图自省/调用块我得到一个异常EXC_BAD_ACCESS (code=2, address=0x0)
我知道我尝试调用UITouchesEvent
是因为框架目标操作。
如何用完成块制作自定义目标?
您不能在那里传递完成块,但是您可以这样做:
self.button = [[UIButton alloc] initWithFrame:CGRectMake(139, 366, 42, 34)];
[self.button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
-(void)buttonPressed:(UIButton*)sender {
[self buttonPressed:sender completion:^{
//something
}];
}
-(void)buttonPressed:(UIButton*)sender completion:(void (^)())completionBlock {
//do something
//invoke block
completionBlock();
}
你不能。对于按钮动作,系统期望有一个参数,也是sender
(动作方法的调用者),即UIButton
实例本身。如果你想用第二个参数做任何事情,我建议你有一个包装器,比如
-(void)buttonPressed:(UIButton*)sender
{
[self customMethodWithcompletion:^{
}];
}
在customMethodWithcompletion
里面你可以执行你的操作
UIKit的target-action监听器必须有以下三个签名之一:
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event
如果有第一个参数,"sender"控件(您正在监听的控件)将被传递给它。如果还有第二个参数,则将UIEvent对象传递给它。您无法控制传递给方法的内容。
有许多第三方库实现了基于块的ui控件API,你可以在互联网上找到。实际上,它们所做的是将完成块作为关联对象附加到控件上,并在处理方法中检索它。