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 自定义目标的主要内容,如果未能解决你的问题,请参考以下文章