Ios 为什么UILabel没有初始化?
代码来自斯坦福CS193p。我添加了一个NSLog来检查它。标签似乎未初始化。有什么想法吗Ios 为什么UILabel没有初始化?,ios,objective-c,setter,init,cs193p,Ios,Objective C,Setter,Init,Cs193p,代码来自斯坦福CS193p。我添加了一个NSLog来检查它。标签似乎未初始化。有什么想法吗 @interface AskerViewController() <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UILabel *questionLabel; @property (weak, nonatomic) NSString *question; @end @implementation AskerViewCo
@interface AskerViewController() <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UILabel *questionLabel;
@property (weak, nonatomic) NSString *question;
@end
@implementation AskerViewController
@synthesize questionLabel = _questionLabel;
@synthesize question = _question;
- (void)setQuestion:(NSString *)question
{
_question = question;
self.questionLabel.text = question;
NSLog(@"label is %@", self.questionLabel);
}
@end
您可能在显示视图控制器之前设置了question string属性,可能是在prepareForSegue:?此时,视图尚未加载,label属性仍然为零 您正在执行,只是缺少了在viewDidLoad中还必须设置标签文本的步骤-此时,您的标签已从情节提要中实例化,可以使用
如果在调用viewDidLoad之前设置属性,则标签应为nil。如果您正在从prepareForSegue设置属性,则该视图尚未加载。视图控制器在需要在屏幕上显示其视图和子视图之前不会加载视图和子视图,并且在执行segue之前不会发生这种情况—您可以猜到,在执行segue之前,prepareForSegue已经完成 什么的接受者和接受者?当他们接到电话时,你需要提供更多信息,否则这个问题无法回答。你是对的。我修改了帖子并添加了代码以使问题具体化。您的UILabel是否连接/链接到questionLabel?
setQuestion:
不会初始化标签。它只设置文本。标签是否已初始化?接口生成器中是否连接了插座?是的,questionLabel通过情节提要连接到控制器如果情节提要中有标签,请勿分配/初始化标签。这就是你的标签的来源。如果在调用viewDidLoad之前设置属性,则标签应为nil。如果您正在从prepareForSegue设置属性,则该视图尚未加载。视图控制器在需要在屏幕上显示其视图和子视图之前不会加载视图和子视图,并且在执行segue之前不会发生这种情况—您可以猜到,在执行segue之前,prepareForSegue已经完成。这已经变成了一个很长的评论,我将把它添加到我的答案中…我明白了。我将segue.destinationViewController.question之类的东西放在prepareforsgue中,它调用setQuestion,然后尝试访问questionLabel,在segue过程中,它还没有作为目标视图控制器的视图层次结构中的子视图加载。这就是NSLog返回null的原因。完全正确。您仍然应该将该代码保留在setQuestion中,因为您可以在视图仍被加载时再次设置问题,您只需要在viewDidLoad中添加额外的位。太棒了!我的想法是在同一个问题上:保留代码self.questionLabel.text=question的目的是什么代码>有问题。如果我没有必要再提出这个问题怎么办?因为逻辑流是授权呈现视图控制器提问,它使用prepareForSegue将问题字符串发送给呈现视图控制器。segue设置呈现的控制器。标签文本在viewDidLoad中设置。我不希望标签以任何其他方式设置。那么,在安全方面,我是否应该删除代码,从而将自定义setter(setQuestion)全部删除?如果您总是这样使用它,那么是的,那就好了。
2012-07-31 01:56:45.177 Kitchen Sink[23931:f803] label is (null)