所以我有一个UITableCell,其中包含一个按钮,可以在我的应用中添加特定的朋友。当朋友请求提交到我的应用程序上的数据库时,我希望按钮文本从"添加"到"添加"。但是,使用我当前的代码,标题不会改变,直到我第二次单击该按钮,即使它到达代码的相同部分,按钮也不会改变,除非我再次点击它(我想最终更改文本后禁用此按钮。)
这是我的代码:
[[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 :(得分:1)
这很可能是异步问题。创建一个类似
的方法- (void)updateButton
{
dispatch_async(dispatch_get_main_queue(), ^{
// update button title
// disable button
});
}
从if (task.result) { }
答案 1 :(得分:0)
如果您不确定是否在主线程中执行了该块,则可以使用此方法进行检查:[NSThread isMainThread]
。这样,您就会知道程序的流程。如果它不在主线程中,则无法更新 ANY 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;
}];