无法在标签或文本字段中显示字符串
Posted
技术标签:
【中文标题】无法在标签或文本字段中显示字符串【英文标题】:Can not display a string in a label or text field 【发布时间】:2014-01-10 16:17:51 【问题描述】:作为一名 ios 编程新手,我可能有一个非常简单的问题。
我有 an iPhone app,它获取 Facebook 用户数据(id、姓名、性别、城市)。
数据用NSLog
打印出来就好了:
id: 597287941
first_name: Alexander
last_name: Farber
gender: male
city: Bochum, Germany
但是我无法让数据显示在我的 UI 中:
我尝试过使用UITextField
和UILabel
。
我已经尝试过使用
[[self userId] setText:dict[@"id"]];
和
[_firstName setText:dict[@"first_name"]];
我已经连接了 IBOutlets just fine(我认为):
下面是我的DetailViewController.h:
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController
@property (strong, nonatomic) NSDictionary *dict;
@property (weak, nonatomic) IBOutlet UILabel *userId;
@property (weak, nonatomic) IBOutlet UILabel *firstName;
@property (weak, nonatomic) IBOutlet UILabel *lastName;
@property (weak, nonatomic) IBOutlet UILabel *gender;
@property (weak, nonatomic) IBOutlet UILabel *city;
@end
还有DetailViewController.m的问题部分:
- (void)setDict:(NSDictionary *)dict
NSLog(@"id: %@", dict[@"id"]);
NSLog(@"first_name: %@", dict[@"first_name"]);
NSLog(@"last_name: %@", dict[@"last_name"]);
NSLog(@"gender: %@", dict[@"gender"]);
NSLog(@"city: %@", dict[@"location"][@"name"]);
[[self userId] setText:dict[@"id"]];
[_firstName setText:dict[@"first_name"]];
[_lastName setText:dict[@"last_name"]];
[_gender setText:dict[@"gender"]];
[_city setText:dict[@"location"][@"name"]];
【问题讨论】:
试试怎么样:userId.text = dict[@"id"]; 你从哪里调用 setDict 方法? @danielM 我打电话给setDict
来自prepareForsegue
: github.com/afarber/ios-newbie/blob/master/oauthFacebook/…
【参考方案1】:
您在标签初始化之前更新视图。仍然在prepareForSegue
方法中调用setDict
以传递信息,但将setText
调用移动到新视图控制器的viewDidLoad
方法中。这将在视图初始化后更新标签。
【讨论】:
就是这样,非常感谢。我会更新我的代码@GitHub【参考方案2】:上面的@DanielM 是正确的,但这就是他想说的。 setDict 方法在 segue 上被调用。这很好,但唯一的工作就是在视图准备好之前保持这些值......
这里是完整的 DetailViewController 实现:
// DetailViewController.h
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController
// this must save the values from Facebook until the VC is ready to use them
@property (strong, nonatomic) NSDictionary *dict;
@property (weak, nonatomic) IBOutlet UILabel *userId;
@property (weak, nonatomic) IBOutlet UILabel *firstName;
@property (weak, nonatomic) IBOutlet UILabel *lastName;
@property (weak, nonatomic) IBOutlet UILabel *gender;
@property (weak, nonatomic) IBOutlet UILabel *city;
@end
@implementation DetailViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
// Custom initialization
return self;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
// this is the key: you cannot set the state of your views before they have
// been created.
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[[self userId] setText:dict[@"id"]];
[_firstName setText:dict[@"first_name"]];
[_lastName setText:dict[@"last_name"]];
[_gender setText:dict[@"gender"]];
[_city setText:dict[@"location"][@"name"]];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
/* don't implement this. it's called too early to make a difference
- (void)setDict:(NSDictionary *)dict
NSLog(@"id: %@", dict[@"id"]);
NSLog(@"first_name: %@", dict[@"first_name"]);
NSLog(@"last_name: %@", dict[@"last_name"]);
NSLog(@"gender: %@", dict[@"gender"]);
NSLog(@"city: %@", dict[@"location"][@"name"]);
NSString *avatar = [NSString stringWithFormat:kAvatar, dict[@"id"]];
NSLog(@"avatar: %@", avatar);
[[self userId] setText:dict[@"id"]];
[_firstName setText:dict[@"first_name"]];
[_lastName setText:dict[@"last_name"]];
[_gender setText:dict[@"gender"]];
[_city setText:dict[@"location"][@"name"]];
*/
@end
【讨论】:
谢谢+1。这里设置标签的更好位置是什么 -viewDidLoad
或 viewWillAppear
?在丹尼尔回答后,我尝试了前者,它也有效:github.com/afarber/ios-newbie/blob/master/oauthFacebook/…
两者都可以。只要在 [super viewDidLoad] 之后;不同之处在于,如果 VC 保留并再次出现,例如在弹出一个推到它上面的之前,viewWillAppear 将再次触发。这有时可能是可取的,例如,如果您希望 dict 值在隐藏时发生变化。【参考方案3】:
我认为 setText 已被弃用 SetText is Deprecated。我想你可以直接使用标签的文本属性。
firstName.text = dict[@"first_name"];
【讨论】:
我试过_userId.text = dict[@"id"];
,但很遗憾没有帮助。
我认为这取决于您在哪里执行此操作。我的意思是说这需要在视图加载后完成。【参考方案4】:
我认为编译器不知道它是什么类。您可以像下面的示例那样使用显式转换进行测试吗?
- (void)setDict:(NSDictionary *)dict
NSLog(@"id: %@", dict[@"id"]);
NSLog(@"first_name: %@", dict[@"first_name"]);
NSLog(@"last_name: %@", dict[@"last_name"]);
NSLog(@"gender: %@", dict[@"gender"]);
NSLog(@"city: %@", dict[@"location"][@"name"]);
[[self userId] setText:dict[@"id"]];
[_firstName setText:(NSString *)dict[@"first_name"]];
[_lastName setText:(NSString *)dict[@"last_name"]];
[_gender setText:(NSString *)dict[@"gender"]];
[_city setText:(NSString *)dict[@"location"][@"name"]];
【讨论】:
编译器确实知道它是什么类。但它是一个 VC,在加载视图之前无法配置它的视图。以上是关于无法在标签或文本字段中显示字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中,如何以编程方式在文本字段中显示动态变化的值?