iOS-UIButton自定义目标



我以编程方式添加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,你可以在互联网上找到。实际上,它们所做的是将完成块作为关联对象附加到控件上,并在处理方法中检索它。

最新更新