2015-02-05 7 views
8

Voglio impedire clic multipli continui sullo stesso UIButton.Come prevenire più eventi sullo stesso UIButton in iOS?

Ho provato con le proprietà enabled e exclusiveTouch ma non ha funzionato. Ad esempio:

-(IBAction) buttonClick:(id)sender{ 
    button.enabled = false; 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 
     // code to execute 
    } 
    completion:^(BOOL finished){ 
     // code to execute 
    }]; 
    button.enabled = true; 
} 
+3

Set abilitato dovrebbe funzionare - mostra il codice che avete tentato. – Paulw11

+0

come @ Paulw11 ha detto che setEnable dovrebbe funzionare, possiamo aiutarti meglio se ci fornisci il codice –

+0

Puoi aggiungere del codice –

risposta

13

Quello che stai facendo è semplicemente l'attivazione/disattivazione attivata all'esterno del blocco. Questo è sbagliato, il suo esecuzione una volta che questo metodo chiamerà, quindi non disabilitando il pulsante fino a quando il blocco di completamento non chiamerebbe. Dovresti invece riattivarlo una volta completata l'animazione.

-(IBAction) buttonClick:(id)sender{ 
    button.enabled = false; 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 
     // code to execute 
    } 
    completion:^(BOOL finished){ 
     // code to execute 
     button.enabled = true; //This is correct. 
    }]; 
    //button.enabled = true; //This is wrong. 
} 

Oh e sì, invece di true e false, YES e NO avrebbe sembra piacevole. :)

+0

Grazie. Ho provato la stessa cosa e ha funzionato – crazydev

+0

Non ha funzionato per me, ho provato questo invece: http://stackoverflow.com/a/32267367/2359049 –

0

Questa è la mia soluzione:

NSInteger _currentClickNum; // Salva il valore corrente del pulsante tag viene cliccato

//Button click event 
- (void)tabBt1nClicked:(UIButton *)sender 
{ 
    NSInteger index = sender.tag; 
    if (index == _currentClickNum) { 
     NSLog(@"Click on the selected current topic, not execution method, avoiding duplicate clicks"); 
    }else { 
     [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(tabBtnClicked:) object:sender]; 
     sender.enabled = NO; 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      sender.enabled = YES; 
     }); 
     _currentClickNum = index; 
     NSLog(@"Column is the current click:%ld",_currentClickNum); 
    } 
} 
0

Nel mio caso l'impostazione isEnabled non era abbastanza veloce per evitare che più rubinetti. Ho dovuto usare una proprietà e una guardia per prevenire più tocchi. E il metodo di azione sta chiamando un delegato che normalmente respinge il controller della vista ma con più pulsanti che non si sta chiudendo. dismiss(...) deve annullare se stesso se il codice è ancora in esecuzione sul controller di visualizzazione, non è sicuro. Indipendentemente da ciò, ho dovuto aggiungere un manuale dismiss alla guardia.

Ecco la mia soluzione ...

private var didAlreadyTapDone = false 
private var didNotAlreadyTapDone: Bool {return !didAlreadyTapDone} 

func done() { 
    guard didNotAlreadyTapDone else { 
     self.dismiss(animated: true, completion: nil) 
     return 
    } 
    didAlreadyTapDone = true 
    self.delegate.didChooseName(name) 
}