2012-09-20 12 views
5

変更可能であることを意味しますので、どうしてこのようなことが起こりますか?フォントの変更時にNSMutableAttributedStringがクラッシュしますか?

attrString = [[NSMutableAttributedString alloc] initWithString:@"Tip 1: Aisle Management The most obvious step – although one that still has not been taken by a disconcerting number of organisations – is to configure cabinets in hot and cold aisles. If you haven’t got your racks into cold and hot aisle configurations, we can advise ways in which you can achieve improved airflow performance."]; 

     [attrString setFont:[UIFont systemFontOfSize:20] range:NSMakeRange(0, 23)]; 
     [attrString setFont:[UIFont systemFontOfSize:15] range:NSMakeRange(24, 325)]; 
     [attrString setTextColor:[UIColor blackColor] range:NSMakeRange(0,184)]; 
     [attrString setTextColor:[UIColor blueColor] range:NSMakeRange(185,325)]; 
     break; 

私のcatextlayerと私のnsmutableattributedsringの両方が私のヘッダファイルに定義されています。私は、スイッチの上に私の文字列に変更を加え、その文字列がで示されcatextlayerを更新するには、このコードを呼び出す:

//updates catext layer 
TextLayer = [CATextLayer layer]; 

TextLayer.bounds = CGRectMake(0.0f, 0.0f, 245.0f, 290.0f); 
TextLayer.string = attrString; 
TextLayer.position = CGPointMake(162.0, 250.0f); 
TextLayer.wrapped = YES; 

[self.view.layer addSublayer:TextLayer]; 

それは、フォントを設定しようとしたときにクラッシュしますが、私はなぜ仕事カント?

- [NSConcreteMutableAttributedStringのsetFont:範囲:]:「 - [NSConcreteMutableAttributedStringのsetFont:範囲:]:認識されていないセレクタによりキャッチされない例外のアプリ 'NSInvalidArgumentException'、理由終端インスタンスに0xd384420 *を送信した送信認識されないセレクターインスタンス0xd384420 '

どうしてですか?

+0

ここでは、帰属文字列の使用を示していくつかの無料のコードです:github.com/artmayes167/Attribute – AMayes

答えて

10

NSMutableAttributedStringには、setFont:range:機能がありません。 iphone/ipad: How exactly use NSAttributedString?

ここから撮影

は....だから私は、ドキュメントからの読み取りのビットをしました。あなたはまだしている場合

機能は...だから、あなたがこのような何かを行うことができるはず...

[string setAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetice-Neue"]} range:NSMakeRange(0, 2)]; 

または

[string setAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Helvetice-Neue"], NSFontAttributeName", nil] range:NSMakeRange(0, 2)]; 

[NSMutableAttirbutedString setAttributes:NSDictionary range:NSRange]; 

です古いObjC構文を使用します。

希望に役立ちます。

+0

私は宣言されていないNSFontAttributeNameの使用に関するエラーが出ますか?私はまだ色を試していない。 – dev6546

+0

は文書を読んだ後に編集されました。 https://developer.apple.com/library/mac//#/documentation/Cocoa/Reference/Foundation/Classes/NSMutableAttributedString_Class/Reference/Reference.html – Fogmeister

+0

私は、これらのドキュメントはos x 10+で動作し、クラッシュ。 – dev6546

1

まず、attrStringをプロパティといいますか?それがプロパティの場合は、コピー属性でプロパティを宣言したことを確認して、おそらくコンパイラ生成のセッターを使用していますか? YESの場合コンパイラ生成のセッターがオブジェクトにコピーメッセージを送信してコピーを作成します。コピーメッセージは不変のコピーを作成します。つまり、NSMutableAttributedStringではなくNSAttributedStringを作成します。この問題を解決するために

一つの方法は、あなたがARCを使用している場合は、このように、mutableCopyを使用して、独自のセッターを書くことです:

- (void)setTextCopy:(NSMutableAttributedString *)text { 
    textCopy = [text mutableCopy]; 
} 

またはこのような手動参照カウント使用している場合:

- (void)setTextCopy:(NSMutableAttributedString *)text { 
    [textCopy release]; 
    textCopy = [text mutableCopy]; 
} 

textCopyをNSMutableAttributedStringの代わりにNSAttributedStringにし、コードの残りの部分を不変オブジェクトとして使用することもできます。

参考: 1️⃣How to copy a NSMutableAttributedString 2️⃣NSConcreteAttributedString mutableString crash

関連する問題