-1

我正在从一个 uibutton 调用一个方法(在这种情况下是一个 uibuttons 数组)。问题是按钮应该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];

感谢您对此的任何帮助。

4

3 回答 3

4

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

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

NSURLConnection方法sendAsynchronousRequest是一种执行异步下载的简单方法:

+ (void)sendAsynchronousRequest:(NSURLRequest *)request
  queue:(NSOperationQueue *)queue
  completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
于 2013-02-24T12:28:38.733 回答
3

接口永远不应该像那样被阻塞。想象一下用户在按下按钮时想知道发生了什么的挫败感。想象一下自己在想是否按下它。如果需要一两秒钟,它应该在主线程之外完成,这样界面就不会冻结,用户会立即知道发生了什么。

如果您尝试下载某些东西,您当然应该查看NSURLConnection 文档页面,并使用该sendAsynchronousRequest:queue:completionHandler:方法。

于 2013-02-24T12:34:32.367 回答
0

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

然后你从 action 方法中调用这个加载方法

[self performSelector:@selector(loadingMethod) withObject:nil afterDelay:0.0];
于 2013-02-24T12:29:28.470 回答