Pergunta

Então, eu criei um TableViewCell costume, e na ponta eu coloquei um UISwitch. Antes eu tinha mesmo conectei a nada, se eu corri-lo no simulador e clicar nele, ele iria mudar de desligado para ligado com a animação e tal.

Eu estou tentando adicionar um recurso onde o usuário só é permitido mudar de desligado para ligado quando uma determinada condição é verdadeira. Eu quero isso para que, quando o usuário toca o switch, ele verifica se a condição for verdadeira, e se ele não é o interruptor não se move.

Eu configurei um IBAction onde se o usuário toca por dentro, ele vai correr a minha função. Minha função é a seguinte:

if([on_switch isOn])
    {
        if([my_switch canSwitchOn])
        {
            NSLog(@"SWITCHED ON SUCCESSFULLY");
            [on_switch setOn:TRUE animated:TRUE];
        }
        else
        {
            NSLog(@"SWITCHED ON UNSUCCESSFULLY");
                        //Put in popup here
        }
    }
    else
    {
        [[ClassesSingleton sharedSingleton] classSwitchedOff:cell_index];
        [on_switch setOn:FALSE animated:TRUE];
    }

No entanto, não importa o que eu faço, que o interruptor vai virar, mesmo que eu dei-lhe não as indicações para o fazer. Tenho certeza de que é a auto-flip que fazer com que ele a fazê-lo mesmo antes de eu tinha nada ligado a ele. Existe uma maneira de desligar isso?

Obrigado!

Foi útil?

Solução

O que você precisa fazer é propriedade userInteractionEnabled definido como falso em seu UISwitch.

Se você tivesse allready fez a conexão em Interface Builder para uma IBOutlet você delared em sua classe possuir, você seria capaz de colocá-lo em código como este:

mySwitch.userInteractionEnabled = NO;

Você também pode definir a propriedade diretamente no Interface Builder, selecionando a caixa de seleção, como mostrado abaixo (No entanto, em seu aplicativo, você está indo para necessidade de ligar o botão até uma IBOutlet qualquer maneira para implementar sua lógica condicional.) alt texto http://www.clixtr.com/photo/ef06c1f7- 8cca-40cd-a454-5ca534ceb9fe

Outras dicas

Eu acho que você vai precisar de algo como o seguinte:

// Somewhere just after the creation of _switch
[_switch addTarget:self action:@selector(switchValueDidChange:) forControlEvents:UIControlEventValueChanged];

// Target/Action method
- (void)switchValueDidChange:(UISwitch *)sender {
    if(sender.on && [self canSwitchOn] == NO){
        [sender setOn:NO animated:YES];
        // Popup
    }
}

O problema que você está tendo é que o interruptor já cometeu ele está em estado de toque. Quando isso não é o caso (não tenho a certeza, nunca testou) você tem que verificar se o interruptor está atualmente não por diante. Este trecho de código irá reverter o estado quando o utilizador não tinha permissão para ligar o interruptor.

A melhor maneira é para desativar o controle, mas talvez isso não é o que você quer neste caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top