【问题标题】:iOS: changing a UILabel text of a modal view programmaticallyiOS:以编程方式更改模式视图的 UILabel 文本
【发布时间】:2013-05-14 17:19:23
【问题描述】:

我有一个有两个屏幕的应用。在第一个屏幕中,有一个按钮可以通过模态 segue 作为模态视图打开第二个屏幕,并且它有一个 UILabel。

我希望这个 UILabel 有一个特定的文本,该文本会根据用户单击按钮的次数而有所不同(它们是提示:用户只能单击按钮并看到提示三次)。 每次单击按钮时,我正在做的是以下方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"TipModal"]) {
        QuizTipViewController * detailViewController = (QuizTipViewController *) segue.destinationViewController;
        detailViewController.delegate = self;
        detailViewController.tipText = self.quiz.currentTip;
        [detailViewController.numberTipsText setText:[NSString stringWithFormat:@"Pistas para la respuesta (usadas %ld de 3)", (long)self.quiz.tipCount]] ;
        NSLog(@"%d", self.quiz.tipCount);
        NSLog(@"%@", detailViewController.numberTipsText.text);
    }
}

最后两条日志的输出如下:

2013-05-14 19:10:47.987 QuoteQuiz[1241:c07] 0
2013-05-14 19:10:47.989 QuoteQuiz[1241:c07] Hints (0 out of 3 used)

不过,UILabel 中的文本始终为空。

在模态窗口的视图控制器的.h文件中,我将UILabel定义为:

@property (strong, nonatomic) IBOutlet UILabel* numberTipsText;

我什至在实现文件中创建了:

-(UILabel *)numberTipsText {
    if (!_numberTipsText) {
        _numberTipsText = [[UILabel alloc] init];
    }
    return _numberTipsText;
}

请知道为什么会发生这种情况吗?

提前非常感谢!

【问题讨论】:

  • 当您将文本分配给标签时,您确定视图控制器的视图已加载吗?如果不是,则将文本分配给在 getter 中创建的 UILabel,但在加载视图时,该属性将被覆盖。
  • @MarcinKuptel 如果NSLog(@"%@", detailViewController.numberTipsText.text); 显示输出,它不应该被加载吗?
  • 好吧,您的标签已创建,但控制器的视图可能未加载。然后你必须将你的标签添加到控制器的视图中。如果您为 _numberTipsText 分配一个值,然后从 nib 加载控制器的视图,则您分配的值将被破坏。
  • @MarcusAdams 它已连接。
  • 只需将文本分配给 NSString 属性,然后在 viewDidLoad 中将该属性的值设置为标签的文本。

标签: ios uilabel uistoryboard uistoryboardsegue


【解决方案1】:

标签没有文本的原因是因为您将文本分配给在您的标签中创建的标签

-(UILabel *)numberTipsText

吸气剂。然后,当控制器的视图从 nib 加载时,numberTipsText 属性将被从 nib 加载的标签覆盖,该标签不包含任何文本。解决方案是删除创建新 UILabel 的 getter,然后:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"TipModal"]) {
        QuizTipViewController * detailViewController = (QuizTipViewController *) segue.destinationViewController;
        detailViewController.delegate = self;
        detailViewController.tipText = self.quiz.currentTip;
        //numberOfTipsText is a NSString property
        detailViewController.numberOfTipsText = [NSString stringWithFormat:@"Pistas para la respuesta (usadas %ld de 3)", (long)self.quiz.tipCount];
    }
}

在 QuizTipViewController 的 viewDidLoad 方法中:

- (void) viewDidLoad
{
    [super viewDidLoad];
    self.numberOfTipsLabel.text = self.numberOfTipsText;
}

【讨论】:

  • 明白了,谢谢!这是标准和正常的方法吗?对于每个标签,我需要拥有标签及其 IBOutlet 和 NSString 属性以包含其传递的文本?
  • 如果你有很多 NSString 对象想要传递给另一个控制器,那么你可以把它们都放在字典中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多