我在Objective-C iOS应用程序中更新UI时遇到一些问题。
我在我的ViewController的viewDidLoad部分调用我的函数fetchData。
NSURLSession
成功地获取了数据,但是我无法更新UI中的titleText属性,即使它在主队列上。
我可以更新viewDidLoad方法中的属性,所以我感觉这与异步请求有关。
然而,我已经尝试了多种方法,但都没有成功,因此任何帮助都将不胜感激。
- (void) fetchData
{
NSString *strURl = @"www.url.com";
NSLog(@"%@",strURl);
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:strURl]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
if (data == nil) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"error", nil)message:NO_CONNECTION_TEXT preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* ok = [UIAlertAction actionWithTitle:NSLocalizedString(@"ok", nil) style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:ok];
[self presentViewController:alertController animated:YES completion:nil];
return ;
}
else
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (!parsedDetails){
parsedDetails = [[NSMutableArray alloc]init];
}
parsedDetails = [provider parseJSON:data into:parsedDetails withResponse:response];
NSLog(@"%@",parsedDetails);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",parsedDetails);
NSLog(@"%@",[parsedDetails valueForKey:@"title"]);
self.titleText = [parsedDetails valueForKey:@"title"];
});
});
}
}] resume];
}
发布于 2018-06-03 00:57:53
第1部分:确定标题
parsedDetails
是代码中的NSMutableArray
。
然后在该数组上使用KVC (键值编码)方法valueForKey
。
但这确实会返回一个新的数组。发生了什么:原始数组(parsedDetails
)中每个元素的title
属性值作为新元素插入到一个新数组中,该数组最终作为数组返回。
由于你上面的评论:
NSLog(@"%@",[parsedDetails valueForKey:@"title"]);
给出返回值(只有一个字符串的数组):
("About")
但是您实际需要的是第一个条目的title元素,所以应该是这样的:
Detail *detail = parsedDetails.firstObject;
if (detail) {
title = [detail title];
} else {
title = @"default empty title";
}
或者,如果您更喜欢KVC变体:
id detail = parsedDetails.firstObject;
if (detail) {
title = [detail valueForKey:@"title"];
} else {
title = @"default empty title";
}
第2部分:更新标签
据我所知,您有一个名为titleText
的NSString
属性?大概定义如下:
@property (nonatomic, strong) IBOutlet NSString *titleText;
你在什么地方也有UILabel
插座?
@property (weak, nonatomic) IBOutlet UILabel *label;
如果您只更新本地字符串,它将不会反映在UI中。你还需要把它转移到标签上。
这看起来像这样:
self.label.text = self.titleText;
https://stackoverflow.com/questions/50656730
复制相似问题