为什么当我单击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]]; }
希望这可以帮助。