Depois que meu usuário clicar em um botão, gostaria que ele permanecesse pressionado durante o tempo em que realizasse uma operação de rede. Quando a operação da rede for concluída, quero que o botão volte ao estado padrão.
Eu tentei chamar - [UIButton setSelected:YES]
logo depois de apertar o botão (com uma chamada correspondente para - [UIButton setSelected:NO]
depois que minha operação de rede terminar), mas não parece fazer nada. A mesma coisa se eu ligar setHighlighted:
.
Suponho que poderia tentar trocar a imagem de fundo para denotar um estado selecionado durante a operação de rede, mas isso parece um hack. Alguma sugestão melhor?
Aqui está a aparência do meu código:
- (IBAction)checkInButtonPushed
{
self.checkInButton.enabled = NO;
self.checkInButton.selected = YES;
self.checkInButton.highlighted = YES;
[self.checkInActivityIndicatorView startAnimating];
[CheckInOperation startWithPlace:self.place delegate:self];
}
- (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace possibleError:(NSError*)error;
{
[self.checkInActivityIndicatorView stopAnimating];
self.checkInButton.enabled = YES;
self.checkInButton.selected = NO;
self.checkInButton.highlighted = NO;
}
Eu tenho uma maneira mais fácil. Basta usar "performSelector" com 0 atraso para executar
[button setHighlighted:YES]
. Isso executará o realce novamente após o término do loop de execução atual.fonte
"Tudo fica melhor quando você liga"
funciona perfeitamente ... depois de conectar a tomada no botão no Interface Builder.
Você não precisa setBackgroundImage: forState :, o construtor permite que você especifique as imagens de fundo (será redimensionado se necessário) ou / e de primeiro plano (sem redimensionamento).
fonte
Tente usar NSOperationQueue para fazer isso. Experimente o código da seguinte forma:
Espero que isto ajude.
fonte
Use um bloco para que você não precise construir um método totalmente separado:
Atualizar
Para ficar claro, você ainda precisa definir o fundo (ou imagem normal) para os estados de combinação, bem como os regulares, como sbrocket diz na resposta aceita. Em algum momento, seu botão estará selecionado e destacado, e você não terá uma imagem para isso, a menos que faça algo assim:
Caso contrário, o botão pode voltar para a imagem UIControlStateNormal para o breve estado selecionado + realçado e você verá um flash.
fonte
dispatch_get_current_queue()
é declarado como sendo "não confiável".dispatch_after
em oposição adispatch_async
?dispatch_async
é a melhor escolha.Rapidamente estou fazendo como o seguinte.
Eu crio uma subclasse de
UIButton
e implementei uma propriedade personalizadastate
Funciona perfeitamente para mim.
fonte
Tive um problema semelhante em que queria um botão para mantê-lo realçado após o clique. O problema é que se você tentar usar
setHighlighted:YES
dentro de sua ação de clique, ela será redefinida logo após você clicar em ação,- (IBAction)checkInButtonPushed
Resolvi isso usando um NSTimer como este
e depois chamar
setHighlighted:YES
do meuselectCurrentIndex
método. Eu usoUIButtonTypeRoundedRect
botões normais .fonte
Eu tenho outra maneira ... se você não quiser usar imagens, e quiser o efeito de um botão pressionado, você pode criar uma subclasse do botão e aqui está meu código:
no arquivo .h:
No arquivo .m:
fonte
Aqui está uma implementação C # / MonoTouch (Xamarin.iOS) usando as abordagens apresentadas acima. Ele assume que você já definiu o estado de imagem em destaque e configura os estados de | destaque selecionado e selecionado para usar a mesma imagem.
fonte