2013-06-04 4 views
1

Могу ли я отключить кнопку на короткое время? У меня есть вид регистрации, на 3 неправильных попытках он примет пользовательский внешний вид регистрации, и он отключит кнопку регистрации в течение некоторого времени, скажем, 5 минут. Является ли это возможным?Отключить UIControl на некоторое время

ответ

5
- (void) processAfterWrongAttempts { 
    button.enabled = NO; 

    double delayInSeconds = 5.0 * 60; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     button.enabled = YES; 
    }); 
} 
+2

да, лучший подход ... я записывал сам ответ. : P –

+0

Да лучше использовать другую тему ..! – Gihan

+0

@Gihan Никаких других потоков не было. Блок будет выполнен в основном потоке. Блоки легкие. –

0

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

1

Disable Зарегистрирован Кнопку затем, расписание NSTimer в течение 5 мин.

[NSTimer scheduledTimerWithTimeInterval:300.0f target:self selector:@selector(showSignUpButton:) userInfo:nil repeats:NO]; 

-(void)showSignUpButton:(NSTimer *)timer 
{ 
    [signUpButton setEnabled:YES]; 
} 
2

Что вы можете сделать, это использовать Grand Central Dispatch. GCD - ваш друг.

Как это работает, вы запросите определенный блок кода, который будет выполнен через определенное время.

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

в файле заголовок:

@property (nonatomic, assign) int numTries; 

в вашей реализации файл (.m):

@synthesize numTries = numTries_; 


- (IBAction)buttonClicked:(id)sender { 
    self.numTries++; 
    if (self.numTries > 3) { 
     myButton.enabled = NO; 
     double delayInSeconds = 15.0; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
      myButton.enabled = YES; 
      numTries = 0; 
     }); 
    } 
} 

Это приведет к этому блоку кода выполняется через 15 секунд. Вы можете, конечно, изменить delayInSeconds на любое значение, которое вы пожелаете. dispatch_get_main_queue() возвращает поток пользовательского интерфейса, что означает, что код в блоке ^{ ... } выполняется в потоке пользовательского интерфейса.

+0

Спасибо за подробный ответ Блейн Мюррей :) Он отлично работает – Hassy

0

Почему бы не использовать этот

- (void) startTimer { 
    [NSTimer scheduledTimerWithTimeInterval:1 
            target:self 
            selector:@selector(enable) 
            userInfo:nil 
            repeats:NO]; 
} 

- (void) enable { 
    [signUpButton setEnabled:YES]; 

} 

Лучшее решение было бы использовать performSelector вместо scheduledTimerWithTimeInterval

[self performSelector:@select(enable) withObject:nil afterDelay:3.0]; 
0
//Disable button at start 
[self performSelector:@select(showButton) withObject:nil afterDelay:5.0]; 
//write enable button code in showButton method 

другой путь вокруг

[self performBlock:^{ 
    //enable button 
    } afterDelay:5.0f]; 
Смежные вопросы