将标签文本设置为变量iOS 7

时间:2014-02-05 22:07:11

标签: ios objective-c

我正在尝试做一些我认为很容易的事情,但由于某些原因(缺乏经验)它不起作用。我从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);

4 个答案:

答案 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;
});