Невозможно сохранить UIButton в выбранном состоянии после события TouchUpInside - PullRequest
6 голосов
/ 11 января 2012

Мне нужна кнопка UIB, чтобы поддерживать нажатое состояние. По сути, если кнопка находится в нормальном состоянии, я хочу коснуться кнопки, она подсвечивается стандартным синим цветом и затем остается синей после поднятия пальца. Я сделал следующую UIAction и подключил к ней событие Touch Up Inside.

-(IBAction) emergencyButtonPress:(id) sender
{
    if(emergencyButton.highlighted)
    {
        emergencyButton.selected = NO;
        emergencyButton.highlighted = NO;
    }
    else
    {
        emergencyButton.selected = YES;
        emergencyButton.highlighted = YES;
    }
}

Но что происходит, когда я убираю палец, кнопка возвращается на белый фон. Для теста я добавил UISwitch и выполнил тот же код:

-(IBAction) emergencySwitchClick:(id) sender
{
    if(emergencyButton.highlighted)
    {
        emergencyButton.selected = NO;
        emergencyButton.highlighted = NO;
    }
    else
    {
        emergencyButton.selected = YES;
        emergencyButton.highlighted = YES;
    }
}

В этом случае кнопка переключается в подсвеченное и не подсвеченное состояние, как я и ожидал.

Есть ли другое событие после события Touch Up Inside, которое восстанавливает состояние до «нормального»? Как мне сохранить выделенное состояние?

Ответы [ 7 ]

6 голосов
/ 11 января 2012

Подсвеченное состояние применяется и удаляется iOS, когда вы касаетесь / отпускаете кнопку.Так что не зависите от него в вашем методе действия.

Как говорится в одном из других ответов, установите выделенное изображение таким же, как выбранное изображение, а затем измените свой метод действия:

-(IBAction) emergencyButtonPress:(id) sender 
{
    emergencyButton.selected = !emergencyButton.selected;     
} 
2 голосов
/ 11 января 2012

Если вы хотите что-то наподобие кнопки переключения, настройте свое «выбранное» состояние как ваше «нажатое» состояние, а затем напишите что-то вроде этого:

- (IBAction)buttonTapped:(id)sender {
    [(UIButton*)sender setSelected:![sender isSelected]];
}
1 голос
/ 06 июля 2012

У меня была такая же проблема, и вот что у меня сработало:

-(IBAction)buttonPressed:(id)sender {
if (isSelected) {
    [_button setSelected:NO];
    [_button setImage:[UIImage imageNamed:@"not_selected.png"] forState:UIControlStateSelected]; 
    isSelected=NO;

}
else {
    [_button setSelected:YES];
    [_button setImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
    isSelected=YES;
}
}
1 голос
/ 11 января 2012

Если вы хотите, чтобы вышеуказанный код работал, вы должны установить изображение для выбранного состояния и одно (даже то же самое) для выделенного состояния.

[emergencyButton setBackgroundImage:buttonHighlightImage forState:UIControlStateHighlighted];
[emergencyButton setBackgroundImage:buttonHighlightImage forState:UIControlStateSelected];

надеюсь, это поможет.

0 голосов
/ 08 февраля 2014

Попробуйте этот простой ответ ....

- (void)mybutton:(id)sender
{
    UIButton *button = (UIButton *)sender;
    button.selected = ![button isSelected]; // Important line
    if (button.selected)
    {
        NSLog(@"Selected");
        NSLog(@"%i",button.tag);
    }
    else
    {
        NSLog(@"Un Selected");
        NSLog(@"%i",button.tag);

    }
 }
0 голосов
/ 17 июля 2013

Это сработало для меня:

- (void)tapButton:(id)sender{
    UIButton *button = sender;
    if (!button.selected){
        [self performSelector:@selector(highlight:) withObject:button afterDelay:0.0];
    }else{
        [self performSelector:@selector(removeHighlight:) withObject:button afterDelay:0.0];
    }
}

- (void)highlight:(UIButton *)button{
    button.selected = !button.selected;
    button.highlighted = YES;
}

- (void)removeHighlight:(UIButton *)button{
    button.selected = !button.selected;
    button.highlighted = NO;
}
0 голосов
/ 11 января 2012

К сожалению, это невозможно, как только вы отпустите, Apple снова изменит состояние. Одна из опций, которую я использовал ранее (но не очень), заключается в том, что вы используете executeSelector с задержкой 0,1 после нажатия кнопки, чтобы снова поставить его в выбранное состояние. Это сработало в моем случае.

РЕДАКТИРОВАТЬ: Если вы не хотите видеть мигающий эффект, просто установите задержку на 0,0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...