let mutableString:NSMutableString = (resultLabel.attributedText as! NSMutableAttributedString).mutableString
mutableString.replaceOccurrencesOfString("@1", withString: "109", options:
NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, mutableString.length))
결국 이 두 줄의 코드.
AS3 할때도 이런 경우가 있었는데 HTML 형식으로 formatting한 label을 다룰때 생각보다 간단하지 않았다.
물론 해결하고 나니 속 시원했었지만.
이게 다 저 @1 부분을 replace 하려고 시작한 일이었다.
조금 더 다양한 가능을 보려고 손을 좀 더 보았다.
Xcode 에서 이걸 직접 살펴보았다.
<attributedString key="attributedText">
<fragment content="이거이 사람이 할 짓이 아닌가 봅니다.
">
">
<attributes>
<color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
<font key="NSFont" size="17" name="AppleSDGothicNeo-Regular"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="진짜">
<attributes>
<color key="NSColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" size="24" name="AppleSDGothicNeo-Bold"/>
<font key="NSOriginalFont" size="17" name="AppleSDGothicNeo-Bold"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content=" 속이 상해서 참말로
">
">
<attributes>
<color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
<font key="NSFont" size="17" name="AppleSDGothicNeo-Regular"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="@1%">
<attributes>
<color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
<font key="NSFont" size="24" name="AppleSDGothicNeo-Regular"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content=" 부분만 살짝 갈아끼워줍니다.">
<attributes>
<color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
<font key="NSFont" size="17" name="AppleSDGothicNeo-Regular"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString>
보면 attributedString 아래에 fragment 단위로 누어져있고 그 아래 attributes 가 있고 그 안에 color/font/paragrapthStyle 등등이 있는 걸 볼 수 있다.
HTML DOM 을 만드는 것과 비슷하게 할 수 있지만 지금 당장 필요한 것은 본문을 손상하지 않고 내용만 바꾸고 싶은데 이걸 전체를 들었다가 다시 생성하는 건 너무 삽질이라고 생각.
debugger를 열고 attributedText를 관찰해보자
(lldb) print (resultLabel.attributedText)
(NSAttributedString?) $R10 = 0x00007fa99c8a2f90 {
ObjectiveC.NSObject = {...}
}
NSAttributedString (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/index.html#//apple_ref/occ/cl/NSAttributedString)를 살펴보니
이런게 있다.
Mutable!! 바꿀 수 있다는 소리다!
(lldb) po (resultLabel.attributedText as! NSMutableAttributedString).mutableString
이거이 사람이 할 짓이 아닌가 봅니다.
진짜 속이 상해서 참말로
@1% 부분만 살짝 갈아끼워줍니다.
진짜 속이 상해서 참말로
@1% 부분만 살짝 갈아끼워줍니다.
오케이!
이거야 이거!
mutableString 이면 바꿀 수 있다.
mutableString 을 보니 NSMutableString 이다.
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableString_Class/index.html#//apple_ref/occ/instm/NSMutableString/replaceOccurrencesOfString:withString:options:range:
MutableString 이라면 이런게 있지!
replaceOccurrencesOfString!!
Declaration
SWIFT
func replaceOccurrencesOfString(_ target
: String,
withString replacement
: String,
options options
: NSStringCompareOptions,
range searchRange
: NSRange) -> Int
OBJECTIVE-C
- (NSUInteger)replaceOccurrencesOfString:(NSString *)target
withString:(NSString *)replacement
options:(NSStringCompareOptions)opts
range:(NSRange)searchRange
바꿀 것은 target 에 주고 withString 에 변경할 문자열을 지정한다.
에 나온 options는 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/doc/constant_group/Search_and_Comparison_Options 를 참조.
정확한 일치를 원하므로 NSStringCompareOptions.LiteralSearch 를 사용한다.
여기에 Range 가 좀 걸리는데
만들어주자.
Declaration
OBJECTIVE-C
NSRange NSMakeRange ( NSUInteger loc, NSUInteger len );
Return Value
An
NSRange
with location location
and length length
.Availability
Available in OS X v10.0 and later.
0부터 mutableString의 길이까지 지정해주면 된다.
새로 만드는 걸 했다면 거대한 삽질을 할뻔.
댓글
댓글 쓰기