无法在标签或文本字段中显示字符串

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 中:

我尝试过使用UITextFieldUILabel

我已经尝试过使用

[[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。这里设置标签的更好位置是什么 - viewDidLoadviewWillAppear?在丹尼尔回答后,我尝试了前者,它也有效: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 中,如何以编程方式在文本字段中显示动态变化的值?

SwiftUI 显示标签/文本中剩余的字符数

字符串未显示在 TextField 的 TextArea 中

如何逐个字符显示标签文本?

无法检查文本字段是不是为空

文本或输入框显示json格式字符串