未调用自定义 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