iOS-UIButton 自定义目标

Posted

技术标签:

【中文标题】iOS-UIButton 自定义目标【英文标题】:iOS-UIButton custom target 【发布时间】:2014-05-04 11:33:32 【问题描述】:

我以编程方式添加 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

如何使用完成块制作自定义目标?

提前 10 倍!

【问题讨论】:

对不起,我不明白你想通过什么块...这个块要通过哪里? 我试图通过哪个块并不重要,重要的是问题的核心,如何使用完成块制作 UIButton 的目标? 我问这个只是为了了解情况,但如果是核心,我在下面回复你;) 我不会投反对票。我在下面回复,阅读我的完整示例。 @MatteoGobbi 谢谢老兄!其他人投票给我,我问他为什么.. 【参考方案1】:

不能在那里传递完成块,但你可以做这样的事情:

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();

【讨论】:

【参考方案2】:

你不能。对于按钮动作,系统期望有一个参数,这也是sender(动作方法的调用者),即UIButton 实例本身。如果你想用第二个参数做任何事情,我建议你有一个包装器,比如

-(void)buttonPressed:(UIButton*)sender

 [self customMethodWithcompletion:^

];

您可以在customMethodWithcompletion 中执行您的操作。

【讨论】:

【参考方案3】:

target-action listener for UIKit 必须具有以下三个签名之一:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

如果有第一个参数,“发送者”控件(您正在监听动作的控件)将被传递给它。如果还有第二个参数,则将 UIEvent 对象传递给它。您无法控制传递给该方法的内容。

有许多第三方库为您可以在 Internet 上找到的 UIControls 实现基于块的 API。本质上,他们所做的是将完成块作为关联对象附加到控件,并在处理方法中检索它。

【讨论】:

以上是关于iOS-UIButton 自定义目标的主要内容,如果未能解决你的问题,请参考以下文章

Keras 自定义目标需要张量评估

Propertygrid:根据 Margin 目标属性创建自定义属性定义

如何实现自定义控件的目标动作机制?

NSKeyedArchiver 并在目标之间共享自定义类

使用自定义图像按钮在 UIToolbar 上命中目标不正确

未调用自定义 UIControll 目标操作