我有一个UIViewController
,其中包含一组按钮,每个按钮都有一个(唯一的)标记。我写了以下方法:
- (void) highlightButtonWithTag: (NSInteger) tag
{
UIButton *btn = (UIButton *)[self.view viewWithTag: tag];
btn.highlighted = YES;
}
我要做的是有一堆按钮,每个按钮的功能就像一个切换:当我点击一个按钮时,它应该变为活动状态(即突出显示),之前突出显示的按钮应变为" un& #34;突出
当视图出现时,我使用viewDidAppear
方法设置初始选择:
- (void) viewDidAppear:(BOOL)animated
{
self.selectedIcon = 1;
[self highlightButtonWithTag: self.selectedIcon];
}
这似乎工作正常:当视图出现时,第一个按钮被选中。但是,当我尝试通过连接到按钮的@selector
更新内容时,前一个按钮会突出显示,但sender.tag
按钮不会突出显示。
- (IBAction) selectIcon:(UIButton *)sender
{
// "Un"highlight previous button
UIButton *prevButton = (UIButton *)[self.view viewWithTag: self.selectedIcon];
prevButton.highlighted = NO;
// Highlight tapped button:
self.selectedIcon = sender.tag;
[self highlightButtonWithTag: self.selectedIcon];
}
我在这里缺少什么?
答案 0 :(得分:1)
问题是系统自动突出显示然后分别取消触摸touchDown和touchUp上的按钮。因此,在系统未突出显示之后,您需要再次突出显示该按钮。您可以使用performSelector:withObject:afterDelay:即使延迟为0(因为选择器是在运行循环上调度的,这是在系统完成后不亮的情况下发生的)。要使用该方法,您必须传递一个对象(不是整数),因此如果稍微修改代码以使用NSNumbers,它将如下所示,
- (void) highlightButtonWithTag:(NSNumber *) tag {
UIButton *btn = (UIButton *)[self.view viewWithTag:tag.integerValue];
btn.highlighted = YES;
}
- (void) viewDidAppear:(BOOL)animated {
self.selectedIcon = 1;
[self highlightButtonWithTag: @(self.selectedIcon)];
}
- (IBAction) selectIcon:(UIButton *)sender {
// "Un"highlight previous button
UIButton *prevButton = (UIButton *)[self.view viewWithTag: self.selectedIcon];
prevButton.highlighted = NO;
// Highlight tapped button:
self.selectedIcon = sender.tag;
[self performSelector:@selector(highlightButtonWithTag:) withObject:@(self.selectedIcon) afterDelay:0];
}