UIButton没有调用目标的选择器

时间:2013-09-07 20:44:28

标签: iphone ios objective-c uibutton

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

当我点击它时,它会突出显示。但是,我在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 个答案:

答案 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:调用将转到您从未添加到视图层次结构中的按钮。