Ios 更改UILabel文本,但保留其余属性

Ios 更改UILabel文本,但保留其余属性,ios,objective-c,uilabel,Ios,Objective C,Uilabel,我的ViewController中有一个UILabel,它是使用故事板创建的。标签文本的字体、大小和颜色、对齐方式—都在情节提要中设置。故事板中的标签连接到我文件中名为p_patientNameLbl的插座 现在,我尝试通过编程更改标签的文本,如下所示: [self.p_patientNameLbl setText:@"Vasya"]; [self.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString strin

我的ViewController中有一个UILabel,它是使用故事板创建的。标签文本的字体、大小和颜色、对齐方式—都在情节提要中设置。故事板中的标签连接到我文件中名为p_patientNameLbl的插座

现在,我尝试通过编程更改标签的文本,如下所示:

[self.p_patientNameLbl setText:@"Vasya"];
[self.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString stringWithFormat:@"%d", myClass.text] col:[UIColor redColor]  size:50.0f]];
我无法看到新文本,直到我意识到故事板中的原始标签是黑色背景上的白色,但显然在我如上所述更改标签的文本后,所有字体属性都已重置,现在它是黑色背景上的黑色文本,因此看不到。一旦我以编程方式设置了颜色:

[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];
我可以看到新标签,但所有其他字体属性和对齐方式仍然是错误的


是否有一种方法可以只更改标签的文本,而不必通过编程设置所有其他属性?我想一定有办法,因为我不想在代码中格式化我的接口

我已经为多个应用程序多次这样做了。我总是在故事板中制作标签和文本,在编辑器中更改字体大小、颜色显示、alpha值等。但是之后如果我需要修改文本,我已经做了很多次了,我所做的就是这样

p_patientNameLbl.textColor = [UIColor redColor];
p_patientNameLbl.text = @"My Sample Text";

就这样。将保留所有其他默认属性。除非我在你的问题中遗漏了什么

之所以发生这种情况,是因为您告诉Interface builder在其文本上设置了预定义属性的标签,并用纯文本替换此属性文本。您必须使用
setAttributedText
并指定要传递给属性字符串的属性,而不是
setText
setTextColor

下面是一个如何通过编程将属性字符串应用于标签的示例。我不知道有什么更好的方法,但使用它,您可以对文本或文本颜色进行更改,只要您设置其他属性,所有更改都将正确应用

[myLabel setAttributedText:[self myLabelAttributes:@"Some awesome text!"]];

....................

- (NSMutableAttributedString *)myLabelAttributes:(NSString *)input
{
    NSMutableAttributedString *labelAttributes = [[NSMutableAttributedString alloc] initWithString:input];

    [labelAttributes addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:-5.0] range:NSMakeRange(0, labelAttributes.length)];
    [labelAttributes addAttribute:NSStrokeColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, labelAttributes.length)];
    [labelAttributes addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, labelAttributes.length)];

    return labelAttributes;
}
这对我很有用:

- (void)setText:(NSString *)text withExistingAttributesInLabel:(UILabel *)label {

    // Check label has existing text
    if ([label.attributedText length]) {

        // Extract attributes
        NSDictionary *attributes = [(NSAttributedString *)label.attributedText attributesAtIndex:0 effectiveRange:NULL];

        // Set new text with extracted attributes
        label.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];

    }

}

...

[self setText:@"Some text" withExistingAttributesInLabel:self.aLabel];

0x7fffffff,谢谢你的提示,这对我很有用。在iOS6中,这里的一些其他建议不起作用,例如提取属性并重新应用它们

在我的例子中,我丢失了很多有用的属性,包括字体,因此我的解决方案如下:

- (NSMutableAttributedString *)SetLabelAttributes:(NSString *)input col:(UIColor *)col size:(Size)size {

NSMutableAttributedString *labelAttributes = [[NSMutableAttributedString alloc] initWithString:input];

UIFont *font=[UIFont fontWithName:@"Helvetica Neue" size:size];

NSMutableParagraphStyle* style = [NSMutableParagraphStyle new];
style.alignment = NSTextAlignmentCenter;

[labelAttributes addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, labelAttributes.length)];
[labelAttributes addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, labelAttributes.length)];
[labelAttributes addAttribute:NSForegroundColorAttributeName value:col range:NSMakeRange(0, labelAttributes.length)];

return labelAttributes;
}
然后将其应用于UILabel,如下所示:

[self.p_patientNameLbl setText:@"Vasya"];
[self.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString stringWithFormat:@"%d", myClass.text] col:[UIColor redColor]  size:50.0f]];

与存储旧属性并使用更改的文本和存储的属性创建新的NSAttributedString不同,相对简单的方法是:

NSMutableAttributedString *attStr = [label.attributedText mutableCopy];
NSMutableString *str = attStr.mutableString;
/* change str with new text */
label.attributedText = attStr;

Swift中的单线实施:

label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))

Swift 4

label.attributedText = NSAttributedString(string: "new label text", attributes: label.attributedText!.attributes(at: 0, effectiveRange: nil))

(Bartłomiej Semanńczyk回答中的一些次要更改)

setText:
不应更改UILabel的颜色。如果您在设置文本之前和之后记录self.p\u patientNameLbl.textColor,日志会告诉您什么?字体大小、对齐方式-更改文本后,它们都不相同。所以,我也必须设置这些。但问题是,人们真的不应该担心应用程序在代码中的外观!如果明天我决定改变我的应用程序的外观并切换到白色背景等-这是在故事板中完成的-为什么我还需要去改变代码?这就是我所说的,你的项目或代码有问题。我还可以在stroyboard中定义字体大小和对齐方式,我可以通过代码更改文本颜色和字体,而不会影响我通过故事板为该标签定义的任何其他标签属性。@user1959008使用
NSLog(@“%@”,self.p_patientNameLbl.textColor)检查UILabel的颜色
在您
setText
之前和之后。它改变了吗?是的,问题是故事板使用了一个属性化的文本,而这个文本丢失了——这看起来更像是一个bug(或疏忽)注意:对其他人来说,这个问题只存在于iOS 6.0中-iOS 5.0工作正常,正如我所建议的注意:看起来我突然得出结论,您在Interface Builder中使用的是属性文本而不是纯文本。如果你不是,请忽略这个答案。正确,我使用的是属性文本。现在我知道问题是什么了,我甚至在完全相同的问题上发现了另一个stackOverflow:。令人惊奇的是,如此简单的事情需要变得如此困难!谢谢@user1959008很乐意帮忙!如果我的答案对你有帮助,那么请点击我帖子旁边的“复选标记”将其标记为正确@彼得-请记住,虽然属性文本在其他上下文中已经存在了一段时间,但它只能在ios 6的标签中使用。所以没有太多的经验。两个小时后我才发现问题所在,5分钟后我就解决了,谢谢你;)