【问题标题】:UIButton Selector Not Called in ARCARC 中未调用 UIButton 选择器
【发布时间】:2012-06-04 20:41:22
【问题描述】:

我有两个类,一个View 和一个ViewController. View 创建一个按钮如下:

_button = [[UIButton alloc] initWithFrame:CGRectMake(50, 0, buttonImage.size.width, buttonImage.size.height)];
[_button setImage:buttonImage forState:UIControlStateNormal];
[_button setImage:[UIImage imageNamed:@"btn_learn_focus_pad"] forState:UIControlEventTouchUpInside];
[_button addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside];
[_someView addSubview:_button];

ViewController中,我实例化loadView中的视图后,添加一个选择器如下:

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

选择器没有被调用。我试图在ViewController 按钮的位置NSLog 并打印出一个零。我怀疑 ARC 正在释放按钮。然而,_button 是一个 strong 指针 (@property)。所以我不确定为什么会这样。

我该如何解决这个问题?

【问题讨论】:

  • 你为什么要传递nil 作为-addTarget:action:forControlEvents: 的选择器?这是无效的,我很惊讶它没有抛出参数断言。
  • 另外,您正在为无效状态设置图像。 UIControlEventTouchUpInside 是 1UIControlStateHighlighted,它只是 1。
  • UIControlEventTouchUpInside 有效。当您触摸按钮时。

标签: objective-c uibutton automatic-ref-counting selector


【解决方案1】:

您没有使用由属性合成生成的正确 getter/setter 方法。如果您只是将第一行更改为:

self.button = [[UIButton alloc] initWithFrame:CGRectMake(50, 0, buttonImage.size.width, buttonImage.size.height)];

它会正确地保留指针

【讨论】:

  • 哦.. 那么为什么直接访问 ivar 不能正确保留指针呢?
  • 其实同样的问题依然存在。我把所有的_button都换成了self.button,还是不行。
  • 当你编写像self.button = [[UIButton alloc] init]; 这样的代码时,无论你是否意识到,你都在使用自动生成的setButton 方法。当您只是执行_button = [[UIButton alloc] init]; 时,它只是将地址设置为您的指针变量,并且不会自动增加您创建的按钮的保留计数
  • @Nayefc 您可能没有保留按钮的父视图或视图本身。如果不查看更多代码,我真的无法判断问题所在。
  • 我明白了 - 还有一个问题,但你的回答也是正确的(我有两个问题)。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多