在第二次单击之前,UIButton不会以编程方式更新

时间:2016-11-15 00:31:12

标签: ios objective-c uibutton

所以我有一个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的按钮文字?

2 个答案:

答案 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;
}];