在某些情况下,UIButton不会启用

时间:2016-01-15 11:30:20

标签: ios objective-c uibutton

在我的应用程序中,我使用UIButton(myButton),我通过Storyboard添加了。 因此,点击按钮时会调用IBAction

-(IBAction)buttonAction:(UIButton*)sender{
    [myCustomClass doSomeCrazyStuff];
    [sender setEnabled:NO];
}

正如您所看到的,我正在从myCustomClass调用方法(myCustomClass是我的网络服务的REST客户端。)
该按钮所在的viewControllermyCustomClass的委托 实现了两种委托方法,一种用于成功,另一种用于错误

-(void)requestSucceeded{  
    /* If the request succeeded i want the button to be enabled again, and it's selected  
       state inverted */  
    NSLog(@"This gets called");
    [myButton setEnabled:YES];
    [myButton setSelected:!myButton.selected];
}

这完全没问题:按下按钮,在myCustomClass上完成操作,请求成功,按钮设置为反转选择状态。
但现在对于其他委托方法:

-(void)requestFailed{
    /* If the request failed i want the button to be enabled again, and it's selected  
       state stays the same */   
    NSLog(@"That gets called"); 
    [myButton setEnabled:YES];
}

如果requestFailed被调用,控制台会按预期打印被调用,但该按钮会被禁用...而且我不知道为什么。
我尝试了requestFailed中的其他内容:

[myButton setHidden:YES];

只是为了查看对myButton的引用是否有效...
它是。

我现在可能错过了一些东西,但我无法弄明白。
谢谢你的帮助。

修改
我不认为可以从不同的线程调用requestFailed(如@ gonji-dev所提到的),因为requestSucceededrequestFailed都是从同一方法调用的。
在我的doSomeCrazyStuff方法中,我设置了一个处理连接成功和错误的完成块。如果发生错误,则会在另一个类中处理。如果连接成功,我要求HTTP状态代码来决定是否会调用requestFailedrequestSucceeded

1 个答案:

答案 0 :(得分:0)

https://stackoverflow.com/a/31952060/218152类似的情况 你是否非常肯定你在调用:

[myButton setEnabled:YES];

在主线程上?

行业标准在操纵UI以响应通知或多线程环境时是:

dispatch_async(dispatch_get_main_queue(), ^{
    // update UI
});