【问题标题】:iOS-UIButton custom targetiOS-UIButton 自定义目标
【发布时间】: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 谢谢老兄!其他人投票给我,我问他为什么..

标签: ios uibutton selector objective-c-blocks


【解决方案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。本质上,他们所做的是将完成块作为关联对象附加到控件,并在处理方法中检索它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-08
        • 2014-01-04
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-10
        相关资源
        最近更新 更多