2014-01-22 1 views
0

В моем приложении я создал кнопку. При нажатии этой кнопки выполняется длинная задача, и кнопка отключается, когда задача запускается и включается, когда задача завершена. Моя проблема в том, что даже после отключения UIbutton он регистрирует событие клика и вызывает тот же метод после завершения задачи.Как остановить отключенный UIbutton от выполнения действия click

Я приложил мой код ниже:

- (IBAction)sync_data_all:(id)sender { 
    // disable button on main thread 

    [NSThread detachNewThreadSelector:@selector(DisableButton) toTarget:self withObject:nil]; 

    UIApplication *app = [UIApplication sharedApplication]; 
    app.networkActivityIndicatorVisible = NO; 

    // long tasks start 

    [self fetchUNsyncedOrders]; 

    [self DeleteproductCategoryTable]; 
    [self deleteproductTable]; 

    [self deletecustomersGroupsTable]; 
    [self deletefetchCustomersTable]; 
    [self deletefetchCustomersAddress]; 

    [self deletefetchOrders]; 
    [self deletefetchOrderItems]; 
    [self deleteCreateOrdersGroups]; 

    [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 

    [NSThread detachNewThreadSelector:@selector(StartActivityIndicatorIn) toTarget:self withObject:nil]; 
    progress = 0.0f; 

    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 

    @try { 
    [self productCategoryTable]; 
    progress = 0.3; 

    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 


    [self productTable]; 

    progress = 0.4; 
    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 

    [self customersGroupsTable]; 
    progress = 0.5; 
    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 


    [self fetchCustomersTable]; 

    progress = 0.6; 

    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 
    [self fetchCustomersAddress]; 

    progress = 0.7; 

    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 
    [self fetchOrders]; 

    progress = 0.8; 

    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 

    [self fetchOrderItems]; 
    progress = 1.0; 

    [NSThread detachNewThreadSelector:@selector(progressBarProgress) toTarget:self withObject:nil]; 
    [self CreateOrdersGroups]; 
    } 

    @catch (NSException *exception) 
    { 
    [NSThread detachNewThreadSelector:@selector(syncNotComplete) toTarget:self withObject:nil]; 

    syncError = YES; 
    } 

    @finally { 
    [self performSelector:@selector(increaseProgress) withObject:nil afterDelay:0.0]; 
    } 


    // long task stop 

    [indicator stopAnimating]; 

    self.view.userInteractionEnabled = YES; 
    _btn_sync_outlet.enabled = YES; 
    _btn_sync_outlet.userInteractionEnabled = YES; 
} 

- (void)DisableButton { 
    self.view.userInteractionEnabled = NO; 
    _btn_sync_outlet.enabled = NO; 
    _btn_sync_outlet.userInteractionEnabled = NO; 
} 

ответ

2

Вы должны отключить его неправильно. docs для UIButton.enabled состояние:

Если включено состояние НЕТ, управление игнорирует событие прикосновения и подклассов могут рисовать по-разному.

Убедитесь, что DisableButton вызывается путем добавления NSLog() вызова или использовать НОД и покончит с DisableButton метода в целом:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    self.view.userInteractionEnabled = NO; 
    _btn_sync_outlet.enabled = NO; 
    _btn_sync_outlet.userInteractionEnabled = NO; 
}); 
+0

спасибо за комментарий я отключил UIButton правильно используя UIButtonOulet.enabled = NO даже в моем случае, когда я скрываю UIButton это registor нажмите событие –

+0

@HARSHMAAN Попробуйте использовать код НОДА вместо (он вызывает отключение кода * * синхронно). – trojanfoe

+0

спасибо за предложения он отлично работает при добавленной задержке для возврата назад [self performSelector: @selector (enableNow) withObject: nil afterDelay: 1.0]; –

0

Спасибо за предложения. Он отлично работает, когда я добавил задержки для включения обратно:

[self performSelector:@selector(enableNow) withObject:nil afterDelay:1.0]; 
1

Если кнопка отправляет сообщения на цель на UIControlEventTouchUpInside, то вы можете коснуться вниз на кнопку, прежде чем она будет отключена и подправить после того, как он получил инвалидов и он все равно отправит сообщение своей цели.

Попробуйте использовать это, чтобы прекратить получать события прикосновения:

- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents

Очевидно, что вы будете хотеть, чтобы добавить цель еще раз, когда вы снова включите кнопку.

+0

Вау, это была моя проблема! Спасибо огромное! У вас есть источник для этого? – pdesantis

+0

Добро пожаловать. Для чего вам нужен источник? – singingAtom

+0

Извините, я имею в виду, что это где-нибудь зарегистрировано Apple? – pdesantis

Смежные вопросы