2016-11-15 53 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不是零,并且您位于主线程上。如果其中任何一个为false,则UI更新将失败。 – jsd

+0

该块是异步的吗?尝试更新主线程上的按钮标题。 – JKoko

回答

1

这很可能是一个异步问题。创建像

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

的方法和从内if (task.result) { }

+0

如果它是一个异步的问题,也不会控制台已打印着“您正试图修改从后台线程UI”线的东西? – Rikh

0

调用此方法,如果您如果块是在主线程中执行不知道,那么你可以使用这种方法检查:[NSThread isMainThread]。这样,你就会知道你的程序的流程。如果不是在主线程,那么你就不能更新任何 UI元素。有关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; 
}]; 
相关问题