为什么当我单击Objective-C中的button图像时,发件人未被调用?

我是IOS和Objective-C的新手,我尝试为UIButton设置Image 。 温我点击button,button会改变image1 。 如果再次单击button ,它将变成image2

首先,我像下面的代码一样在Viewdidload设置image

  @interface AITPreviewViewController () { VLCMediaPlayer *mediaPlayer ; BOOL recording ; BOOL recordMode; } - (void)viewDidLoad { recordMode = YES; UIButton *modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 450, 60, 60)]; [modeChangeButton setBackgroundImage:[UIImage imageNamed:@"recordmode.PNG"] forState:UIControlStateNormal]; [self.view addSubview:modeChangeButton]; } 

当我点击button,button将改变图像。 代码如下所示:

 - (IBAction)modeButtonClick:(id)sender { NSLog(@"modeButtonClick..!!!!!!"); if (recordMode == YES) { NSLog(@"modeButtonClick..%hhd = " , recordMode); [self.modeChangeButton setBackgroundImage:[UIImage imageNamed:@"photomode.png"] forState:UIControlStateNormal]; recordMode = NO; }else if (recordMode == NO){ NSLog(@"modeButtonClick..%hhd = " , recordMode); [self.modeChangeButton setBackgroundImage:[UIImage imageNamed:@"recordmode.png"] forState:UIControlStateNormal]; recordMode = YES; } } 

当我点击button上的图像时,button的图像颜色变深。 看来button已经按下了。 但- (IBAction)modeButtonClick:(id)sender didn't called

当我点击空白处(图像的一侧)时,button已经按下。 - (IBAction)modeButtonClick:(id)sender has been called 。 而且图像也变成其他图像。

我相信我已经在header file.m file设置了操作。

以上描述如下图所示。 在这里输入图像说明

看起来button是按图像覆盖的,图像和button不一样。 为什么会发生? 如何解决这个问题呢 ?

提前致谢。

你可以实现的变化

首先:将setBackgroundImage更改为setImage 。 例如: [self.modeChangeButton setImage: [UIImage imageNamed: @"recordmode.png" forControlState: UIControlStateNormal];

这样,如果您错误地将图像设置到button上,这将覆盖它。

第二:确保你已经连接你的参考sockets(IBOutlet)和行动(IBActions)在接口生成器 – 无论XIB文件,还是故事板。 如果你不把那些接口对象和代码中的接口对象连接起来,它们将不能工作。

第三:如果仍然无法工作,请尝试将此行添加到您的viewDidLoad

 [self.modeChangeButton addTarget:self @selector(modeButtonClick:) forControlEvents:UIControlEventTouchUpInside]; 

第四:在你的viewDidLoad改变这一行:

 UIButton *modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 450, 60, 60)]; 

至:

 self.modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 450, 60, 60)]; 

这应该可以解决你的问题。

这段代码是在你的self.modeChangeButton顶部添加一个新的button,我假设它来自xib或storyboard。

  - (void)viewDidLoad { recordMode = YES; UIButton *modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 450, 60, 60)]; [modeChangeButton setBackgroundImage:[UIImage imageNamed:@"recordmode.PNG"] forState:UIControlStateNormal]; [self.view addSubview:modeChangeButton]; } 

这样做,而不是…

  - (void)viewDidLoad { self.recordMode = YES; } - (void)setRecordMode:(BOOL)recordMode { _recordMode = recordMode; UIImage *imageForMode = recordMode ? [UIImage imageNamed:@"photomode.png"] : [UIImage imageNamed:@"recordmode.png"]; [self.modeChangeButton setBackgroundImage:imageForMode forState:UIControlStateNormal]; } - (IBAction)modeButtonClick:(id)sender { self.recordMode = !self.recordMode; } 

检查您的button尺寸,使框架尺寸接近图像尺寸。 并尝试保持这两个图像如下所示。

 - (void)viewDidLoad { UIButton *modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 450, 60, 60)]; [modeChangeButton setImage:[UIImage imageNamed:@"recordmode.PNG"] forState:UIControlStateNormal]; [modeChangeButton setImage:[UIImage imageNamed:@"photomode.png"] forState:UIControlStateSelected]; [modeChangeButton addTarget:self action:@selector(modeButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:modeChangeButton]; } - (IBAction)modeButtonClick:(id)sender { sender.selected = !sender.selected; } 

尝试修改你的viewDidLoad方法如下。

 - (void)viewDidLoad { [super viewDidLoad]; UIButton *modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 300, 60, 60)]; [modeChangeButton setBackgroundImage:[UIImage imageNamed:@"recordmode.PNG"] forState:UIControlStateNormal]; // You might need to add following two lines into your code. [modeChangeButton addTarget:self action:@selector(modeButtonClick:) forControlEvents:UIControlEventTouchUpInside]; self.modeChangeButton = modeChangeButton; [self.view addSubview:modeChangeButton]; } 

以上的解决scheme应该工 正如我所看到的,你在modeButtonClick方法中引用了名为modeChangeButton的属性。 但是你并没有将创build的button分配给你的财产。 你也必须将动作select器设置为你的button。

作为一种改进,您可以这样做来提高应用程序的性能。 点击事件时不需要设置背景图像,您可以select/取消selectbutton。 有了这个,你不需要维护布尔标志,这可能会给你的应用程序带来新的bug。

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIButton *modeChangeButton = [[UIButton alloc] initWithFrame:CGRectMake(200, 300, 60, 60)]; [modeChangeButton setBackgroundImage:[UIImage imageNamed:@"recordmode.png"] forState:UIControlStateNormal]; [modeChangeButton setBackgroundImage:[UIImage imageNamed:@"photomode.png"] forState:UIControlStateSelected]; [modeChangeButton addTarget:self action:@selector(modeButtonClick:) forControlEvents:UIControlEventTouchUpInside]; self.modeChangeButton = modeChangeButton; [self.view addSubview:modeChangeButton]; } - (IBAction)modeButtonClick:(id)sender { NSLog(@"modeButtonClick..!!!!!!"); [self.modeChangeButton setSelected:![self.modeChangeButton isSelected]]; } 

希望这可以帮助。