3

我有一个不调用其目标选择器的按钮。

当我单击它时,它确实会突出显示。但是,我设置了一个断点playButtonClicked,它永远不会到达。

我不确定它是否会被释放,但我不这么认为。我启用了 ARC,但我无法调用retainrelease

我也尝试过明确启用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
4

4 回答 4

5

你的代码没有按照你的想法做。

当您传入playButton-initializeButton:...立即创建一个新按钮并将其分配给该变量时,您不再对playButton指向的值进行操作。因此,当您-addTarget:action:forControlState:之后调用时,您将目标分配给playButton发生指向的任何内容,而不是您刚刚创建和添加的按钮。

传递指针是通过 value完成的(默认情况下),这意味着您只有指针持有的地址,而不是对指针本身的引用。所以你不能改变指针本身,只能改变它指向的对象。如果要修改指针指向的内容,可以通过引用传递指针;或者你可以重构你的代码,这样你总是直接作用于指针——例如,你可以只使用一个 ivar 或属性,并让你的初始化方法设置该属性。或者您可以返回按钮并将其分配给您的变量或属性。

于 2013-09-07T20:56:20.840 回答
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];
于 2013-09-07T20:58:56.693 回答
1

我认为你应该在方法中做你的初始化工作:

-(void)awakeFromNib {}

就像-viewDidLoad自定义的方法一样UIViews,所有 nib 对象都已加载并准备就绪。

于 2013-09-07T21:13:14.583 回答
0

initializeButton方法的第一行中,您创建了一个新按钮。这个新按钮被设置样式并添加到视图层次结构中。这是您看到的按钮,您可以在启动应用程序时点击该按钮。

但是,您显然还有另一个名为playButton. 您将它传递给initializeButton方法,但如上所述,不要对该引用执行任何操作。这意味着addTarget:调用将转到您从未添加到视图层次结构中的按钮。

于 2013-09-07T20:59:13.353 回答