我正在从一个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];
感谢您的帮助。
答案 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];