如何在调用方法之前更改UIButton的选定状态?

时间:2013-02-24 12:17:22

标签: iphone ios objective-c uibutton

我正在从一个uibutton(在这种情况下是一组uibutton)中调用一个方法。问题是该按钮应立即更改其UIControlStateSelected并显示该按钮的新uiimage。它仅在运行方法后显示图像。该方法下载一些数据并花费一两秒钟。在调用该方法并且按钮图像选择状态改变图像之前,用户显然不确定他们是否触摸过该按钮。

这是我用于按钮选择状态的代码:

        [catBtn setTitle:[NSString stringWithFormat:@"Button %d", i] forState:UIControlStateNormal];
        [catBtn setImage:[UIImage imageNamed:[categoryBtnImages objectAtIndex:i]] forState:UIControlStateNormal];
        [catBtn setTitle:@"I'm selected" forState:UIControlStateSelected];

        [catBtn setImage:[UIImage imageNamed:[categoryBtnImagesSel objectAtIndex:i]] forState:UIControlStateSelected];
     //   NSLog(@"%@",[categoryBtnImagesSel objectAtIndex:i]);

        [catBtn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];

        [catButtonArray addObject:catBtn];

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

最佳猜测只给出部分IBACTION代码:

如果您在按钮的IBACTION方法中执行同步下载,则会阻止UI更新按钮。使用异步下载方法执行下载,以便IBACTION方法完成,按钮可以更新。

NSURLConnection方法sendAsynchronousRequest是执行异步下载的简便方法:

+ (void)sendAsynchronousRequest:(NSURLRequest *)request
  queue:(NSOperationQueue *)queue
  completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

答案 1 :(得分:3)

不应该像这样阻止界面。想象一下,用户在按下按钮时想知道发生了什么,感到很沮丧。想象一下你自己在想是否按下了它。如果它需要一两秒钟,它应该在主线程之外完成,因此接口不会冻结,用户立即知道发生了什么。

如果您要下载某些内容,请务必查看NSURLConnection docs页面,并使用sendAsynchronousRequest:queue:completionHandler:方法。

答案 2 :(得分:0)

您可以将“加载”代码移动到单独的方法中。

然后通过

在action方法中调用此加载方法
[self performSelector:@selector(loadingMethod) withObject:nil afterDelay:0.0];