2011-04-23 67 views
5

我有一個MSMutableAttributedString displayContent。 內容的屬性在字符串 中有所不同,即顏色和字體大小可能因字母而異。appendAttributedString:在NSMutableAttributedString

我想添加一個新的字符到字符串的末尾,併爲它提取displayContent中最後一個字符的屬性。由於受用戶控制,我無法預先知道這些屬性是什麼。

當我追加新角色(tempAttr):

NSAttributedString * tempAttr = [[NSAttributedString alloc] initWithString:appendage]; 
[displayContent appendAttributedString:tempAttr]; 
它似乎整個字符串的屬性重置爲新角色的屬性(我沒有設置

因爲我不能知道他們需要什麼)。

如何獲取tempAttr來獲取displayContent中最後一個字符的屬性? 謝謝。


更新。 以笨拙但功能性的方式取得了進步。 複製的屬性從顯示器(displayContent)的最後一個字符字典,然後重新添加這些屬性到新的角色:

NSMutableDictionary * lastCharAttrs = [NSMutableDictionary dictionaryWithCapacity:5]; 
[lastCharAttrs addEntriesFromDictionary: [displayContent attributesAtIndex:0 
                  effectiveRange:NULL]]; // get style of last letter 
NSMutableAttributedString * tempAttr = [[NSMutableAttributedString alloc] initWithString:newCharacter 
                       attributes:lastCharAttrs]; 

[displayContent appendAttributedString:tempAttr]; // Append to content in the display field 

我本來希望有一個更優雅的方式來做到這一點,如設置一個NSTextField的屬性。

回答

15

我想我偶然發現了一個解決方案,然後找到了這個頁面,同時尋找我爲自己創建的問題的答案(與您的問題相反)。

如果你做到以下幾點:

[[displayContent mutableString] appendString:newCharacter]; 

您將與newCharacter附加落得和「延伸」以前的屬性來覆蓋它。然而,我無法在任何地方找到這種行爲,所以你可能會厭倦依靠它。

+0

非常感謝這篇文章。我用你的代碼替換了代碼,它工作正常。謝謝。任何洞察這爲什麼這個作品? mutableString方法簡單地返回了attributesString的字符串內容。 Doc沒有提及任何關於這些屬性的複製。所以,我沒有看到appendString從哪裏獲取正確的屬性。 – 2011-06-13 21:36:45

+0

我不知道。我無法確定它是否是實現細節(即可能會改變的副作用/行爲),或者它是否是實際的預期行爲。但考慮到它與顯然有它自己的屬性的「appendAttributedString:」相反,我可以看到推理擴展底層字符串應該導致屬性繼續。這就是說,它是如何連接在一起的,我不知道。 – 2011-06-17 00:39:29

+1

@BenCochran你說得對,沒有什麼特別提到的屬性伸展,但文檔確實說:'接收器跟蹤這個字符串的變化,並保持其屬性映射最新。「這似乎是發生了什麼。 – 2014-07-25 06:02:11

相關問題