UILabel将文字归因于不变

时间:2016-04-22 13:13:24

标签: ios objective-c uilabel key-value-observing

我在更新UILabel上的文字时遇到问题。我的ViewController更改了其视图属性phoneNumberString。我的观点观察了这个属性的变化并作出反应,改变了标签的属性文本。它观察使用ReactiveCocoa。

[[RACAble(self.phoneNumberString) distinctUntilChanged]subscribeNext:^(id x) {
    NSString* s=(NSString*)x;
    UIFont* font=[UIFont systemFontOfSize:numbersFontSize weight:UIFontWeightThin];
    NSMutableDictionary* attributesDict=[NSMutableDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName, nil];

    self.phoneNumberLabel.attributedText = [[NSAttributedString alloc]initWithString:s attributes:attributesDict];
    [self.phoneNumberLabel setNeedsDisplay];
    NSLog(@"label att text = %@\nlabel text = %@\ninput string = %@\n==",self.phoneNumberLabel.attributedText,self.phoneNumberLabel.text,x);
}];

它提供以下日志:

label att text = +7 (225{
NSFont = "<UICTFont: 0x7a2942c0> font-family: \".SFUIDisplay-Thin\"; font-weight: normal; font-style: normal; font-size: 25.00pt";
}

label text = +7 (225
input string = +7 (225

我需要将归档文字放在我的UILabel中。问题是它在模拟器中没有提供任何变化。 (使用原生[self observeValueForKeyPath...]会产生相同的效果)。 我使用相同代码的通知解决了这个问题。但我必须使用KVO。

其他信息:

  1. 这是我的初始化代码(在设置观察者之前):

     UILabel* phoneNumberLabel=[[UILabel alloc]init];
    
     font=[UIFont systemFontOfSize:numbersFontSize   weight:UIFontWeightThin];
    
     attributesDict=[NSMutableDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName, nil];
    
     phoneNumberLabel.attributedText=[[NSAttributedString alloc]initWithString:@"+7 " attributes:attributesDict];
    
  2. 两种方法都在主线程上运行。

  3. UILabel的框架足够大,可以分配。

3 个答案:

答案 0 :(得分:3)

如果您在.xib中使用了大小类来设置标签字体,那么属性文本可能无效。要正常工作,请从.xib文件中删除大小类

答案 1 :(得分:0)

看起来您缺少对字符串范围的属性赋值。例如,

NSMutableAttributedString *attributedPhoneNumber = [[NSMutableAttributedString alloc] initWithString:x];
[attributedPhoneNumber addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, [attributedPhoneNumber length])];
self.phoneNumberLabel.attributedText = attributedPhoneNumber;

答案 2 :(得分:0)

尝试在viewDidLayoutSubviews中调用您的方法。对我来说,它成功了。 我在viewDidLoad中这样做,这是一个问题。