在代码块中设置UILabel文本
我有一个NSURLConnection sendAsynchronousRequest的代码块,当我尝试设置UILabel的文本时,永远不会设置文本,即使值存在。 这是我的代码:
NSString *address = [addresses objectAtIndex:indexPath.row]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myurl.com/%@", address]]]; [NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ([data length] > 0 && error == nil) { NSString *dataOfData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if(![dataOfData isEqualToString:@"ERROR: address invalid"]) { [balanceLabel setText:[NSString stringWithFormat:@"Balance: %@", dataOfData]]; if(data) { qrCodeButton.alpha = 1; } } else { errorLabel.text = @"This address is invalid."; } } else if ([data length] == 0 && error == nil) { NSLog(@"Nothing was downloaded."); [balanceLabel setText:@"Server Error, Please Try Again"]; } else if (error != nil){ NSLog(@"Error = %@", error); } }];
为什么UILabel的文字从未设定? 代码块有限制吗? 如果是这样,我将如何解决我的问题? 干杯!
这是因为NSOperationQueue不是主线程。 你在做什么是非法的。 令人遗憾的是,没有必要! 说啊:
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { // ... and the rest exactly as you have it now
全部固定。 您的请求在后台线程上是异步的,但是当它在完成处理程序上返回给您时,您将在主线程上并能够与接口等进行通信。
您的代码操作UI元素应该在主线程上执行。
dispatch_async(dispatch_get_main_queue(), ^{ if ([data length] > 0 && error == nil) { NSString *dataOfData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if(![dataOfData isEqualToString:@"ERROR: address invalid"]) { [balanceLabel setText:[NSString stringWithFormat:@"Balance: %@", dataOfData]]; if(data) { qrCodeButton.alpha = 1; } } else { errorLabel.text = @"This address is invalid."; } } else if ([data length] == 0 && error == nil) { NSLog(@"Nothing was downloaded."); [balanceLabel setText:@"Server Error, Please Try Again"]; } else if (error != nil){ NSLog(@"Error = %@", error); } }) ;
确保errorLabel
不是nil并且UILabel
是可见的(它被添加到视图层次结构中并且其框架是合适的)。