2016-11-15 5 views
0

Итак, у меня есть UITableCell, в котором есть кнопка для добавления определенного друга в мое приложение. Когда запрос друга отправляется в базу данных моего приложения, я хочу, чтобы текст кнопки менялся с «Добавить» на «Добавлен». Однако, с моим текущим кодом, название не изменяется, пока я не нажму кнопку во второй раз, даже если он достигнет той же части кода, кнопка не изменится, если я не нажму на нее второй раз (и я хочу в конечном итоге отключите эту кнопку после изменения текста).UIButton не обновляется программно до второго щелчка

Вот мой код:

[[dynamoDBMapper save:friend] continueWithBlock:^id(AWSTask *task) { 
        if (task.error) { 
         NSLog(@"The request failed. Error: [%@]", task.error); 
        } 
        if (task.exception) { 
         NSLog(@"The request failed. Exception: [%@]", task.exception); 
        } 
        if (task.result) { 
         NSLog(@"Task result is %@", task.result); 
         NSLog(@"You've made it to the change text section"); 
         [_addBtn setTitle:@"Added" forState:UIControlStateNormal]; 
        } 


        return nil; 
       }]; 

Видит кто-то, что я делаю неправильно? Или есть другой способ, которым я могу изменить текст кнопки для _addBtn?

+0

Установить точку останова на строке _addBtn setTitle: строка и проверить две вещи: _addBtn не ноль, и вы находитесь в основном потоке. Если одно из них является ложным, обновление пользовательского интерфейса завершится неудачно. – jsd

+0

Является ли этот блок асинхронным? Попробуйте обновить заголовок кнопки в главном потоке. – JKoko

ответ

1

Это скорее всего асинхронная проблема. Создайте метод, как

- (void)updateButton 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update button title 
     // disable button 
    }); 
} 

И этот метод вызывается из внутренней if (task.result) { }

+0

Если это была асинхронная проблема, разве консоль не печатала бы что-то вдоль строк «вы пытаетесь изменить интерфейс пользователя из фонового потока»? – Rikh

0

Если вы не уверены в том, что блок выполнен в основном потоке, то вы можете проверить его с помощью этого метода: [NSThread isMainThread]. Таким образом, вы будете знать поток вашей программы. Если он не находится в основном потоке, то вы не можете обновить элемент ANY. Все изменения в отношении UI ДОЛЖНЫ выполнить в основной теме. Я просто изменил код, чтобы дать вам образец.

[[dynamoDBMapper save:friend] continueWithBlock:^id(AWSTask *task) 
{ 
    if (task.error) 
    { 
     NSLog(@"The request failed. Error: [%@]", task.error); 
    } 

    if (task.exception) 
    { 
     NSLog(@"The request failed. Exception: [%@]", task.exception); 
    } 

    if (task.result) 
    { 
     NSLog(@"Task result is %@", task.result); 
     NSLog(@"You've made it to the change text section"); 

     //check if current block is in main thread. 
     if([NSThread isMainThread]) 
     { 
      NSLog(@"The block is in main thread"); 

      [_addBtn setTitle:@"Added" forState:UIControlStateNormal]; 
     } 

     else 
     { 
      NSLog(@"The block is not in main thread"); 

      dispatch_async(dispatch_get_main_queue(),^
      { 
       [_addBtn setTitle:@"Added" forState:UIControlStateNormal]; 
      }); 
     } 
    } 

    return nil; 
}]; 
Смежные вопросы