未调用自定义 UIButton 的 setIsSelected 方法

Posted

技术标签:

【中文标题】未调用自定义 UIButton 的 setIsSelected 方法【英文标题】:Custom UIButton's setIsSelected method not called 【发布时间】:2015-05-25 04:16:29 【问题描述】:

我有一个基于 UIButton 的自定义类,我在调用这个自定义类中的自定义 setter 方法时遇到了困难。我将列出这些文件中的代码:

    CallMyMethod.h(UIButton 的子类) CallMyMethod.m CallOtherClassMethod.h(调用CallMyMethod中的setter方法) CallOtherClassMethod.m

CallMyMethod.h

@interface CallMyMethod : UIButton

@property (nonatomic, setter=setIsSelected:) BOOL isSelected;
@property (nonatomic, retain) UIImageView *checkmarkImageView;

- (void)setIsSelected:(BOOL)aIsSelected; //this is unnecessary, I guess

@end

CallMyMethod.m

@implementation CallMyMethod

@synthesize isSelected = _isSelected;
@synthesize checkmarkImageView = _checkmarkImageView;

- (id)initWithFrame:(CGRect)frame

  self = [super initWithFrame:frame];
  if (self) 
    // Initialization code
    [self loadView];
  
  return self;


- (void) loadView

  [self.checkmarkImageView setHidden:YES];


- (UIImageView *)checkmarkImageView

    if (_checkmarkImageView == nil) 

      UIImage *checkmarkImage = [UIImage imageNamed:@"checkmark.png"];

      _checkmarkImageView = [[UIImageView alloc]initWithImage:checkmarkImage];

      [_checkmarkImageView setFrame:CGRectMake(10, 10, 32, 32)];

      [self addSubview:_checkmarkImageView];
  

  return _checkmarkImageView;


- (void)setIsSelected:(BOOL)aIsSelected

  _isSelected = aIsSelected;

  [self.checkmarkImageView setHidden:!_isSelected];
  [self addSubview:_checkmarkImageView];



@end

CallOtherClassMethod.h

@class CallMyMethod;    

@interface CallOtherClassMethod : UIViewController

@property (nonatomic,retain) CallMyMethod *btnCMM;

@end

CallOtherClassMethod.m

#import "CallMyMethod.h"

@implementation CallOtherClassMethod

@synthesize btnCMM;

- (void)viewDidLoad

  [super viewDidLoad];
  self.btnCMM = [[CallMyMethod alloc]initWithFrame:CGRectMake(0, 30, 50, 70)];

  //somewhere in my code I will add btnCMM to the view
  [someView bringSubviewToFront: btnCMM];
  [someView addSubview: btnCMM];



//somewhere where I pressed a button to trigger this method
- (IBAction) pressMe:(id)sender

  NSLog(@"self.btnCMM %@", self.btnCMM); //returned as btnCMM is nil ?!
  [self.btnCMM setIsSelected:YES];


@end

问题在于程序无法运行 setIsSelected 方法中的代码,我在 NSLog 中追踪到 btnCMM 为 nil。我想知道为什么会这样,因为当我将 CallOtherClassMethod 作为 UIViewController 调用时,viewDidLoad 会初始化我的自定义按钮。我在这里做错了吗?

【问题讨论】:

您是否将 btnCMM 添加到某处的视图中?您在 viewDidLoad 中创建它,但从不将其添加为子视图。日志用什么方法说 btnCMM 为零? 是的,我已将 btnCMM 添加到某处的视图中。感谢您提醒我这一点,我会将其添加到代码中。我正在为这个问题做一个摘要,错过了这些细节。也将添加 NSLog,它在 pressMe 方法中 【参考方案1】:

为什么不重写setSelected,这是UIButton上的一个方法,然后使用button.selected = YES

如果您想调试按钮变为 nil 的原因,请在 UIButton 子类中实现 dealloc,在此处设置断点,然后查看堆栈跟踪以查找原因。

【讨论】:

我尝试在自带的 UIButton 中使用 selected,但它也不起作用。 @xiaodouya 尝试在 dealloc 中设置一个断点,正如我在答案中所写的那样 我现在正在尝试,但收到来自应用程序的奇怪响应。我把这个 - (void) dealloc 作为方法放在 CallMyMethod.m (UIButton 子类)中,并在方法的第一行设置断点。应用程序在 CallOtherClassMethod 中第二次调用时崩溃。应用在 ios 7.1 中崩溃,但在 iOS 8.3 中不会崩溃 @xiaodouya 崩溃的堆栈跟踪是什么? 对不起,我说错了,这是一个断点,不是崩溃。应用程序工作正常。回到放断点和dealloc方法的点,如何找到我的按钮为nil的原因?

以上是关于未调用自定义 UIButton 的 setIsSelected 方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift:在自定义视图中未调用 UIButton 触摸事件

自定义 UIView:未调用 UIButton addTarget

按钮未在自定义 UIButton 中注册触摸

子类UIButton:属性未在super.init调用时初始化

UIButton 未显示在自定义 UIView 中

表内的 UIButton 未触发