我正在尝试做一些我认为很容易的事情,但由于某些原因(缺乏经验)它不起作用。我从JSON响应中提取了一些值,并将我的viewcontroller上的标签设置为变量。当我单步执行并调试它时,值存在,但由于某种原因,我无法为它们设置任何标签,或者至少它们没有出现。 HEre是我的Viewcontroller的代码。
#import "VideoDetailViewController.h"
#import "VideoListViewController.h"
#import "MapAnnotation.h"
#import "VideoDetail.h"
@interface VideoDetailViewController ()
@property (readonly) NSString *api_username;
@property (readonly) NSString *api_password;
@property (readonly) NSString *nplays;
@end
@implementation VideoDetailViewController
@synthesize Plays;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = self.name.name;
// Load the data on a background queue...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@"https://%s:%s@api.wistia.com/v1/stats/medias/c3e4797d8f.json", "api", "1b75e458de33a9b3f99d33f6bf409a7e145c570a"]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSError *error;
NSURLResponse *response;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSLog(@"%@", [jsonDict objectForKey:@"play_count"]);
NSNumber *_plays = [jsonDict objectForKey:@"play_count"];
_nplays = [NSNumberFormatter localizedStringFromNumber:_plays numberStyle:NSNumberFormatterNoStyle];
// SET LABEL TO VALUE
Plays.text = _nplays;
}
);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
我再次正确设置了IBOutlet,标签文本仍未改变。甚至我设置的NSLog检查也说标签文本是我设置的数字,但它没有在标签中更改。
// NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSLog(@"%@", [jsonDict objectForKey:@"play_count"]);
NSNumber *_plays = [jsonDict objectForKey:@"play_count"];
_nplays = [NSNumberFormatter localizedStringFromNumber:_plays numberStyle:NSNumberFormatterNoStyle];
self.textEngagement.text = _nplays;
NSLog(@"%@", self.textEngagement.text);
答案 0 :(得分:0)
您需要在标签上设置IBOutlet。最简单的方法是在IB中打开界面,然后打开助理编辑器并将其设置为自动。它可能会显示您的视图控制器的.m文件或.h文件。如果助理编辑器没有自动将您带到那里,请切换到.h文件。然后使用其他属性声明从您的标签控制拖动到标题区域。这应该让你创建一个新的属性。 IB(Interface Builder)将在标题中添加正确的代码,并连接插座,以便在视图控制器的视图加载后它处于活动状态。
在你的情况下,你要设置属性“play”(遵循Objective-C命名约定,它应该是“play”,小写“p”,而不是“play”)
答案 1 :(得分:0)
在标题界面中添加IBOutlet UILabel声明
@interface VideoDetailViewController ()
{
IBOutlet UILabel *title;
}
@property (readonly) NSString *api_username;
@property (readonly) NSString *api_password;
@property (readonly) NSString *nplays;
@end
然后将标题对象连接到您在“界面构建器”
中创建的标签OR
在IB的标签属性中设置标签(即11)(查看部分,在模式下)和
UILabel *name = (UILabel*)[self.view viewWithTag:11];
[name setText:self.name.name];
答案 2 :(得分:0)
我不知道在哪里,UILabel
文字不会改变,无论我在哪里尝试或多少次我删除它并重新开始。
答案 3 :(得分:0)
您正尝试在后台主题上设置标签文字。 您不应该尝试在后台线程上更新UI。 在更新标签值之前,您需要返回主线程:
dispatch_async(dispatch_get_main_queue(), ^{
self.textEngagement.text = _nplays;
});