5

変更可能とは変更できることを意味すると確信していますが、なぜこれが発生するのでしょうか。

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:range:]:認識されないセレクターがインスタンス0xd384420に送信されました *キャッチされない例外'NSInvalidArgumentException'が原因でアプリが終了しました、理由:'-[NSConcreteMutableAttributedString setFont:range:]:認識されないセレクターがインスタンス0xd384420に送信されました

なぜこうなった?

4

2 に答える 2

11

NSMutableAttributedStringにはsetFont:range:関数がありません。

ここから取得.... iphone/ ipad:NSAttributedStringをどの程度正確に使用しますか?

だから私はドキュメントから少し読んだ。

機能は...

[NSMutableAttirbutedString setAttributes:NSDictionary range:NSRange];

だからあなたはこのようなことをすることができるはずです...

[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)];

古いObjC構文をまだ使用している場合。

お役に立てば幸いです。

于 2012-09-20T17:19:44.187 に答える
1

まず、attrStringはプロパティと言っていますか?プロパティの場合は、copy属性でプロパティを宣言しているかどうかを確認し、コンパイラで生成されたセッターを使用していると思われますか?はいの場合コンパイラによって生成されたセッターは、コピーを作成するためにコピーメッセージをオブジェクトに送信します。コピーメッセージは不変のコピーを作成します。つまり、NSMutableAttributedStringではなくNSAttributedStringを作成します。

これを修正する1つの方法は、ARCを使用している場合のように、mutableCopyを使用する独自のセッターを作成することです。

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

または、手動の参照カウントを使用している場合は、次のようになります。

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

もう1つの修正は、textCopyをNSMutableAttributedStringではなくNSAttributedStringにし、残りのコードを不変オブジェクトとして機能させることです。

参照:1️⃣NSMutableAttributedStringをコピーする方法 2️⃣NSConcreteAttributedStringmutableStringのクラッシュ

于 2015-03-27T03:36:13.087 に答える