【问题标题】:Custom UIButton's action does not called未调用自定义 UIButton 的操作
【发布时间】:2013-04-10 07:58:30
【问题描述】:

我有UIButton 的子类:

@interface MyButton : UIButton
- (IBAction) buttonPressed:(id)sender;
@end

@implementation MyButton

- (void)awakeFromNib
{
    NSLog(@"awake from nib");
}


- (IBAction) buttonPressed:(id)sender
{
    NSLog(@"button pressed");
}

@end

我在父 xib 中添加了一个按钮,将其类设置为 MyButton,并将其操作连接到 First Responder 的方法 buttonPressed

当我启动一个应用程序并使用我的按钮加载我的父 xib 时,会调用来自 MyButton 类的 awakeFromNib。但是当我按下按钮时,什么也没有发生。我期待我的方法 buttonPressed 来自 MyButton 类将被调用。

我想,我的按钮视图是响应者链中的第一个响应者,但显然我做错了什么。

你能推荐点什么吗?

【问题讨论】:

  • 这似乎是尝试为按钮进行自定义操作的完全错误的方式。您对 Objective-C 编程有经验吗?
  • @DanF 目标是在不同的 xib 中使用此按钮而不复制粘贴操作,这对于所有情况都是相同的。您能建议另一种方法吗?

标签: iphone ios objective-c cocoa-touch uibutton


【解决方案1】:

如果您希望您的按钮始终调用声明的方法,请将上面的代码添加到 awakeFromNib 方法中

[self addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

稍后当您将其添加到视图控制器时,不要为其分配新操作,这样它将始终调用您的方法。

【讨论】:

  • 谢谢。仍然无法理解为什么它不适用于addTarget:nil,但至少它适用于addTarget:self
  • 当您调用addTarget:action:forControlEvents: 时,您是在告诉编译器,当最后一个参数中指定的事件产生时,它必须调用在 Target 参数上指定的对象的操作中定义的选择器,如果您指定nil,则该方法将发送到nil
  • 我想,addTarget:nil 的意思是一样的,如果我将动作连接到 IB 中的第一响应者,这意味着系统应该使用响应者链来调度动作。 (我从这里了解到:stackoverflow.com/questions/598455/…)如果这是正确的,那么我希望我的按钮方法将被称为第一响应者的方法。而且我不明白为什么它没有按预期工作。
  • 是的,这就是它在 IB 中的工作方式,但从代码中它不一样,从代码中您必须指定目标和操作
【解决方案2】:

取决于您对按钮的操作 - 没有真正需要创建子类。

下面是一些代码,如何制作一个触发方法的简单按钮:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[myButton setFrame:CGRectMake(10, 10, 100, 30)];
[myButton setTitle:@"Title" forState:UIControlStateNormal];
[myButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:myButton];

添加目标位告诉按钮在用户触摸按钮内部(点击它)时触发给定的选择器。目标是选择器所在的对象。

希望这会有所帮助,除非您有自定义布局或特定的自定义功能,否则您不需要继承 UIButton。

【讨论】:

    【解决方案3】:

    由于您想处理按钮代码本身的操作,您可能必须重写此方法- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents 并处理您的事件,就像它被发送到您的按钮一样;

    【讨论】:

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