13

ストーリーボードを使用して作成されたViewControllerにUILabelがあります。ラベルのテキストのフォント、サイズ、色、配置-すべてストーリーボードで設定されます。ストーリーボードのラベルは、p_patientNameLblというファイルのアウトレットに接続されています。

今、私は次のようにプログラムでラベルのテキストを変更しようとしています:

[self.p_patientNameLbl setText:@"Vasya"];

ストーリーボードの元のラベルが黒の背景に白であることに気付くまで、新しいテキストを見ることができませんでしたが、上記のようにラベルのテキストを変更した後、すべてのフォント属性がリセットされ、黒のテキストになりました。背景が黒いため、表示されません。プログラムで色を設定したら:

[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];

新しいラベルは表示されましたが、残りのフォント属性と配置はすべて間違っていました。

プログラムで残りのすべての属性を設定せずに、ラベルのテキストのみを変更する方法はありますか?コードでインターフェイスをフォーマットしたくないので、方法があるはずだと思います。

4

7 に答える 7

18

これは私のために働きます:

- (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];
于 2013-06-16T19:12:16.817 に答える
10

これは、Interface Builderに、テキストに事前定義された属性が設定されているラベルを取得し、この属性付きテキストをプレーンテキストに置き換えるように指示しているために発生しています。の代わりにsetText、または属性付き文字列に渡す属性setTextColorを使用して指定する必要があります。setAttributedText

これは、属性付き文字列をプログラムでラベルに適用する方法の例です。これ以上の方法はわかりませんが、これを使用すると、テキストまたはテキストの色を変更できます。他の属性を一緒に設定する限り、すべての変更が正しく適用されます。

[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;
}
于 2013-01-23T20:14:56.907 に答える
10

Swiftでの1行の実装:

label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))
于 2016-06-20T07:29:08.503 に答える
3

スウィフト4

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

(BartłomiejSemańczykの回答からいくつかのマイナーな変更)

于 2019-06-03T05:17:27.370 に答える
1

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.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString stringWithFormat:@"%d", myClass.text] col:[UIColor redColor]  size:50.0f]];
于 2013-06-20T13:06:51.070 に答える
-1

私はこれを複数のアプリに対して何度も行ってきました。私は常にストーリーボードでラベルとテキストを作成し、エディターでフォントサイズ、カラー表示、アルファ値などを変更します。しかし、その後、何度も行ったテキストを変更する必要がある場合は、これだけです。

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

それでおしまい。他のすべてのデフォルトプロパティは保持されます。私があなたの質問で何かを逃したのでなければ?

于 2013-01-23T20:11:06.240 に答える
-1

古い属性を保存し、変更されたテキストと保存された属性を使用して新しいNSAttributedStringを作成する代わりに、比較的簡単な方法は次のようになります。

NSMutableAttributedString *attStr = [label.attributedText mutableCopy];
NSMutableString *str = attStr.mutableString;
/* change str with new text */
label.attributedText = attStr;
于 2015-10-27T11:15:43.607 に答える