как разрешить только одну выбранную кнопку за раз?/ сделать кнопку знать, если я нажму где-нибудь еще - PullRequest
1 голос
/ 03 июня 2011

как мне сделать эти кнопки, чтобы за один раз можно было использовать только одну?Я не получаю никаких ошибок прямо сейчас, когда я запускаю кстати.Я просто ищу решение моей проблемы.Спасибо за любую помощь

они генерируются в цикле for следующим образом:

    for (int l=0; l<list.length; l++) {  

        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton setTag:l];
        CGRect buttonRect = CGRectMake(11+charact*20, -40 + line*50, 18, 21);
        aButton.frame = buttonRect;

        [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [aButton setTitle:@" " forState:UIControlStateNormal];
        [gameScroll addSubview:aButton];
}

И затем действие при нажатии кнопки:

- (void) buttonClicked:(UIButton *)sender {

    int tag = sender.tag;

    if (sender.selected == TRUE) {
        [sender setSelected:FALSE];
        [sender setBackgroundColor:[UIColor clearColor]];
    }
    else if (sender.selected == FALSE) {
        [sender setSelected:TRUE];
        [sender setBackgroundColor:[UIColor redColor]];
    }
}

сейчас все работает, но я хочу, чтобы он знал, была ли уже выбрана кнопка, и отменил выбор этой другой кнопки, или же автоматически отменяет выбор в любое время, когда пользователь нажимает вне диапазона этой кнопки

заранее спасибо

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

Я бы предложил поместить все ваши кнопки в массив при инициализации вашей кнопки

NSMutableArray* buttons = [NSMutableArray arrayWithCapacity: list.length];

for (int l=0; l<list.length; l++) {  

        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton setTag:l];
        CGRect buttonRect = CGRectMake(11+charact*20, -40 + line*50, 18, 21);
        aButton.frame = buttonRect;

        [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [aButton setTitle:@" " forState:UIControlStateNormal];
        [gameScroll addSubview:aButton];
        [buttons addObject: aButton];
}

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

for (UIButton* button in buttons)
    {
        if (button != sender)
        {
             [button setSelected: FALSE];
             [button setBackgroundColor:[UIColor redColor]];
        }
    }

int tag = sender.tag;

    if (sender.selected == TRUE) {
        [sender setSelected:FALSE];
        [sender setBackgroundColor:[UIColor clearColor]];
    }
    else if (sender.selected == FALSE) {
        [sender setSelected:TRUE];
        [sender setBackgroundColor:[UIColor redColor]];
    }

надежда помогает:)

1 голос
/ 03 июня 2011

Вы можете сохранить текущую выбранную кнопку в отдельной переменной и отменить ее выбор в buttonClicked: метод:

- (void) buttonClicked:(UIButton *)sender {

    int tag = sender.tag;

    currentButton.selected = NO;
    if (currentButton != sender){
       currentButton = sender;
       currentButton.selected = YES;
    }
    else{
       currentButton = nil;
    }
}

Также вы можете указать цвет фона для каждого состояния в самой кнопке, поэтому вам не нужно каждый раз менять его вручную

Если вы также хотите отменить выбор вашей кнопки, когда пользователь просто касается экрана, вы можете реализовать touchesEnded: withEvent: в вашем контроллере представления и сбросить в нем currentButton (этот метод будет вызван, если никакой другой элемент управления не перехватит событие касания - так может быть недостаточно во всех случаях)

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event{
    currentButton.selected = NO;
    currentButton = nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...