我有一个不调用其目标选择器的按钮。
当我点击它时,它会突出显示。但是,我在playButtonClicked
处设置了一个断点,但它永远不会到达。
我不确定它是否会被释放,但我不这么认为。我已启用ARC,但无法拨打retain
或release
。
我也试过明确启用userInteractionEnabled
,但这也没有什么区别。
这是我的代码:
#import "MainMenuView.h"
@implementation MainMenuView
- (void)initializeButton:(UIButton*)button withText:(NSString*)text buttonHeight: (int)buttonHeight buttonWidth:(int)buttonWidth buttonYInitialPosition:(int)buttonYInitialPosition buttonXPosition:(int)buttonXPosition
{
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(buttonXPosition, buttonYInitialPosition, buttonWidth, buttonHeight);
button.backgroundColor = [UIColor clearColor];
[button setBackgroundImage:[UIImage imageNamed:@"button.png"] forState:UIControlStateNormal];
[button setTitle:text forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
button.titleLabel.font = [UIFont boldSystemFontOfSize:24];
[self addSubview:button];
[self bringSubviewToFront:button];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor yellowColor];
UIImage *backgroundImage = [UIImage imageNamed:@"title_background.jpeg"];
UIImageView *background = [[UIImageView alloc] initWithFrame:frame];
background.image = backgroundImage;
background.backgroundColor = [UIColor greenColor];
[self addSubview:background];
int centerWidth = frame.size.width / 2;
int centerHeight = frame.size.height / 9;
int centerXPos = frame.size.width / 4;
int buttonYInitialPosition = frame.size.height / 2 + frame.size.height / 20;
int buttonYOffset = frame.size.height / 7;
// init buttons
[self initializeButton:playButton withText:@"Play" buttonHeight:centerHeight buttonWidth: centerWidth
buttonYInitialPosition:buttonYInitialPosition buttonXPosition:centerXPos];
[playButton addTarget:self action:@selector(playButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
- (void) playButtonClicked:(id)sender
{
NSLog(@"Play Button Clicked");
}
@end
答案 0 :(得分:5)
您的代码没有按照您的想法执行。
当您将playButton
传递给-initializeButton:...
然后立即创建新按钮并将其分配给该变量时,您将不再使用playButton
指向的值。因此,当您事后致电-addTarget:action:forControlState:
时,您会将目标分配给指向的playButton
,而不是您刚创建和添加的按钮。
传递指针(默认情况下)按值完成,这意味着您只拥有指针所保存的地址,而不是指针本身的引用。因此,您无法更改指针本身,只能更改它指向的对象。如果要修改指向的内容,可以通过引用传递指针;或者您可以重构代码,以便您始终直接对指针执行操作 - 例如,您可以使用ivar或属性并让初始化方法设置该属性。或者您可以返回按钮并将其分配给您的变量或属性。
答案 1 :(得分:4)
您正在错误地初始化按钮。更好的方法是让initializeButton
返回按钮。
- (UIButton *)initializeButtonWithText:(NSString*)text buttonHeight: (int)buttonHeight buttonWidth:(int)buttonWidth buttonYInitialPosition:(int)buttonYInitialPosition buttonXPosition:(int)buttonXPosition
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(buttonXPosition, buttonYInitialPosition, buttonWidth, buttonHeight);
button.backgroundColor = [UIColor clearColor];
[button setBackgroundImage:[UIImage imageNamed:@"button.png"] forState:UIControlStateNormal];
[button setTitle:text forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
button.titleLabel.font = [UIFont boldSystemFontOfSize:24];
[self addSubview:button];
[self bringSubviewToFront:button];
return button;
}
然后这样称呼:
playButton = [self initializeButtonWithText:@"Play" buttonHeight:centerHeight buttonWidth: centerWidth
buttonYInitialPosition:buttonYInitialPosition buttonXPosition:centerXPos];
答案 2 :(得分:1)
我认为你应该在方法中进行初始化:
-(void)awakeFromNib {}
这就像自定义-viewDidLoad
的{{1}}方法一样,所有nib对象都已加载并准备就绪。
答案 3 :(得分:0)
在initializeButton
方法的第一行中,您可以创建一个新Button。此新按钮被设置样式并添加到视图层次结构中。这是您看到的按钮,您可以在启动应用时点按该按钮。
但是,你显然有另一个名为playButton
的按钮。您将其传递给initializeButton
方法,但如上所述,请勿对该引用执行任何操作。这意味着addTarget:
调用将转到您从未添加到视图层次结构中的按钮。