Реализация функции переключения в UIButton - PullRequest
1 голос
/ 17 ноября 2010

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

Я думал о создании IBAction, который изменит его с невыбранного на выбранный, как я могу это сделать?

Вот что я пытался:

-(IBAction)toggle {

    //Toggle on implementation.

        button.selected = YES;
        button.highlighted = NO;
        button.enabled = YES;

    //Toggle off implementation.

    if (button.highlighted == YES) {

        button.selected = NO;
        button.highlighted = YES;
        button.enabled = NO;
    }
}

Проблема ...

-(IBAction)toggleFav {

    if (favButton == nil) {

        UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"];
        UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"];
        [favButton setImage:unselectedImage forState:UIControlStateNormal];
        [favButton setImage:selectedImage forState:UIControlStateSelected];
        [favButton setFrame:CGRectMake(0, 0, 40, 40)];
    }       

    if([favButton isSelected]){

        //Add to menu.
        [favButton setSelected:NO];
    } else {

        //Remove from menu.

        [favButton setSelected:YES];
    }
}

Ответы [ 4 ]

11 голосов
/ 26 ноября 2010
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UIImage *unselectedImage = [UIImage imageNamed:@"unselected.png"];
        UIImage *selectedImage = [UIImage imageNamed:@"selected.png"];
        UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
        [b setBackgroundImage:unselectedImage forState:UIControlStateNormal];
        [b setBackgroundImage:selectedImage forState:UIControlStateSelected];
        [b addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
        [b setFrame:CGRectMake(0, 0, 40, 40)];
        [cell.contentView addSubview:b];
    }       
    return cell;
}

-(void) buttonPressed:(UIButton *)sender
{
    if([sender isSelected]){
        //...
        [sender setSelected:NO];
    } else {
        //...    
        [sender setSelected:YES];
    }

}

Ваш код toggleFav не имеет особого смысла.
if (favButton == nil) { проверяет, присутствует ли favButton.Но если вы связываете это с IB, оно всегда должно быть там.А если бы не было, как кнопка могла вызвать этот метод?Так что сделайте это так:

-(void)viewDidLoad
{
    //....
    UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"];
    UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"];
    [favButton setImage:unselectedImage forState:UIControlStateNormal];
    [favButton setImage:selectedImage forState:UIControlStateSelected];
    [favButton setFrame:CGRectMake(0, 0, 40, 40)];
    //....
}


-(IBAction)toggleFav:(UIButton *)sender {
    if([sender isSelected]){
        //...
        [sender setSelected:NO];
    } else {
        //...    
        [sender setSelected:YES];
    }
}

Здесь вы найдете пример проекта с DetaiView, который содержит кнопку с двумя состояниями.: Я сохраняю информацию о том, какая кнопка была выбрана в NSUserDefaults.Вы не должны этого делать.Вместо этого вы хотите сохранить его в модели.Но поскольку у меня нет информации о вашей модели, я просто использую NSUserDefaults.

2 голосов
/ 28 октября 2011
-(void)hitButton:(UIButton*)button
{
    buttonOnFlag = !buttonOnFlag;
    if( buttonFlag )
        [self performSelector:@selector(setHighlight:) withObject:button afterDelay:0];
}

- (void)setHighlight:(UIButton*)button 
{
    button.highlighted = true;
}
0 голосов
/ 25 ноября 2010

Вы должны написать код так:

-(IBAction)toggle:(id)sender {

    //Toggle on implementation.
   if (sender.highlighted == NO)
     {
        sender.selected = YES;
        sender.highlighted = NO;
        sender.enabled = YES;
     }

    //Toggle off implementation.

   else{

        sender.selected = NO;
        sender.highlighted = YES;
        sender.enabled = NO;
    }
}
0 голосов
/ 17 ноября 2010

Использовать свойство button.highlighted

...