我分配给UILabel
的文本在大多数情况下都没有加载:当需要以编程方式重新加载它或重写它时它的工作原理,但在其他情况下它不会。
UILabels已在故事板中创建并且已正确链接。
这里我将提供一个简单的例子:
welcome.h
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
@interface Welcome : UIViewController
@property (strong) IBOutlet UILabel * label;
@property (weak) IBOutlet UIButton * entrar;
//@property (strong, nonatomic) NSString * benvingut;
@end
welcome.m
#import "Welcome.h"
@interface Welcome()
@end
@implementation Welcome
-(void) viewdidLoad{
[super viewDidLoad];
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 140, 47)];
[self.view addSubview: label];
self.label.text = @"Benvingut a la pràtica de iOS I";
label.numberOfLines = 4;
label.textColor = [UIColor blackColor];
}
-(IBAction) buttonPressed: (id) sender
{
[self performSegueWithIdentifier:@"Tutorial1" sender:self];
}
@end
如何解决?
修改
我的标签肯定是奇怪的东西,因为我使用不同的系统将文本加载到其中一个屏幕中,而它在另一个屏幕中可以正常工作。我将添加他们的代码以使其更清晰。
Colors.h
@interface Colors : UIViewController
@property (strong) IBOutlet UILabel * label;
@property (weak) IBOutlet UITextField * color;
@property (weak) IBOutlet UIButton * enviar;
@property (strong) IBOutlet UILabel * correct;
@property (strong, nonatomic) NSString * correcte;
@property (strong, nonatomic) NSString * capcalera;
@end
Colors.m
#import "Colors.h"
@interface Colors()
@end
@implementation Colors
-(void) viewdidLoad{
[super viewDidLoad];
_capcalera = @" Introdueix el color que vols que es mostri.";
self.label.text= self.capcalera;
_correcte = @"";
self.correct.text = self.correcte;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
}
-(void)dismissKeyboard {
[_color resignFirstResponder];
}
@end
在这种情况下,标签不会像我希望的那样初始化,在另一个......
Riddle.h
@interface Riddle : UIViewController
@property (strong) IBOutlet UILabel * label;
@property (weak) IBOutlet UITextField * resposta;
@property (weak) IBOutlet UIButton * enviar;
@property (strong) IBOutlet UILabel * lab;
@property (strong, atomic) NSString * etiqueta;
@property (strong, atomic) NSString * eti;
@end
Riddle.m
#import "Riddle.h"
@interface Riddle()
@end
@implementation Riddle
-(void) viewDidLoad
{
[super viewDidLoad];
_etiqueta = @" 1: Que es allò blanc que tenia Santiago?";
self.label.text = self.etiqueta;
_eti = @"";
self.lab.text = self.eti;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
}
-(void)dismissKeyboard {
[_resposta resignFirstResponder];
}
@end
这里的标签会按照我的说法加载:当编码几乎完全相同时,“颜色”屏幕不会这样做,这很奇怪。
也许这些例子有助于弄清楚我做错了什么?
答案 0 :(得分:2)
您的代码存在的问题是,您似乎正在创建两个单独的标签:一个在您的界面中,一个以编程方式。
事实上,如果您在label
中创建的新viewDidLoad
与您的self.label
IBOutlet具有相同的框架,则这些行会创建一个新标签,以覆盖您的旧版本一个完全:
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 140, 47)];
[self.view addSubview: label];
由于您已经在界面中创建了UILabel
,因此无需以编程方式重新创建它。您可以完全删除上述行,并使用self.label
访问/设置您预先制作的IBOutlet标签。
将[super viewDidLoad];
viewDidLoad
中的所有代码替换为:
self.label.text = @"Benvingut a la pràtica de iOS I";
self.label.numberOfLines = 4;
self.label.textColor = [UIColor blackColor];
编辑:根据AlessandroOrrù的建议,如果您实际上没有在界面中创建标签(尽管您使用IBOutlet暗示了这一点),您也可以通过在{{1之后替换所有代码 - 以编程方式设置UILabel在您的[super viewDidLoad];
中:
viewDidLoad
P.S。如果您在界面中创建了一个标签,但没有正确连接,那么第二个解决方案在技术上可行,但您的原始界面标签将被浪费;所以我建议你学习如何正确地连接self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 140, 47)];
self.label.text = @"Benvingut a la pràtica de iOS I";
self.label.numberOfLines = 4;
self.label.textColor = [UIColor blackColor];
[self.view addSubview: self.label];
。
答案 1 :(得分:2)
这只是问题的错字或您的viewDidLoad
方法真的被称为viewdidLoad
吗?案件事项;)
答案 2 :(得分:1)
您正在将文本分配给IBOutlet参考self.label.text = ...
,但您创建了一个新的UILabel实例,未分配任何文本。
尝试:
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 140, 47)];
[self.view addSubview: label];
label.text = @"Benvingut a la pràtica de iOS I"; // <<-- Removed 'self.'
label.numberOfLines = 4;
label.textColor = [UIColor blackColor];
self.label = label; // <--- Add this
答案 3 :(得分:1)
创建UILabel属性时,必须在创建UILabel时使用该属性。一个例子:
// interface - @property (strong, nonatomic) IBOutlet UILabel *label;
- (void) viewDidLoad
{
self.label = [[UILabel alloc] CGRectMake(0, 0, 140, 47)];
self.label.text = @"text goes here";
// or [self.label setText:@"text goes here"];
}
没有属性变量
- (void) viewDidLoad
{
UILabel *label = [[UILabel alloc] CGRectMake(0, 0, 140, 47)];
label.text = @"text goes here";
// or [self.label setText:@"text goes here"];
}
只是一个总结:如果你要创建一个属性,请确保使用self.varName,这样你就不会让它只是独自坐着。