2012-09-20 82 views
5

我確定mutable意味着它可以改變,所以爲什麼會發生這種情況?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程序:範圍:]:無法識別的選擇發送到實例0xd384420 *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因:「 - [NSConcreteMutableAttributedString setfont程序:範圍:]:無法識別的選擇發送例如0xd384420'

這是怎麼發生的?

+0

下面是一些免費代碼,演示如何使用歸因字符串:github.com/artmayes167/Attribute – AMayes

回答

10

NSMutableAttributedString沒有setFont:range:function。

從這裏拍攝.... iphone/ipad: How exactly use 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語法。

希望有所幫助。

+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是你說的一個屬性嗎?如果它是一個屬性,你最好檢查一下你是否聲明瞭屬性的copy屬性,你估計是使用編譯器生成的setter?如果YES編譯器生成的setter將複製消息發送給對象以進行復制。複製消息將生成不可變的副本。也就是說,它創建一個NSAttributedString,而不是一個NSMutableAttributedString。解決這個問題

的一種方法是,如果你使用ARC編寫自己的二傳手使用mutableCopy,像這樣:

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

或類似這樣的,如果你使用手工引用計數:

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

另一個解決方法是讓textCopy成爲NSAttributedString而不是NSMutableAttributedString,並讓其餘的代碼作爲一個不可變對象工作。

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

相關問題