2017-02-01 8 views
0

나는이 단어를 두드려 텍스트의 단어를 선택할 수있는 UITextView을 가지고 있습니다. 탭한 경우 NSForegroundColor 특성을 변경하여 단어를 강조 표시합니다. 색상을 다시 텍스트 색상으로 변경하여 다시 선택 해제합니다.속성 문자열의 단어가 변경된 단어 가져 오기

이제 모든 선택된 단어를 UITextView에 알아야합니다.

첫 번째 아이디어는 특수 문자 인 모든 것을 제거하고 공간에서 텍스트를 분할하는 것이 었습니다. 그런 다음 색상 속성이 각 단어의 강조/강조 표시 색상과 같은지 확인합니다. 그러나 속성이 지정된 문자열은 문자에서 분리하거나 구성 요소를 제거 할 수 없습니다. NSAttributedString도 마찬가지입니다.

두 번째 아이디어는 강조 표시된 부분의 범위를 배열에 저장하고 반복하여 강조 표시된 부분을 얻는 것입니다. 그러나 이것은 나에게 너무 복잡해 보입니다. 특히 배열에 대한 보장이없는 단어의 올바른 순서가 필요하므로 각 탭에서 추가/제거하십시오 (예 : 텍스트의 경우 : "This is is :"This is is 테스트 "

Tap this -> index 0 
Tap test -> index 1 
Tap this -> test becomes index 0 
Tap this -> this becomes index 1 

다음 순서는 더 이상 좋지 않다.

나는 이미 의한 문자열의 색상을 얻는 방법을 알아 냈어. 즉, 문제가되지 않습니다.

내가 반복 할 수있는 방법 원인이있는 문자열과 색상이 바뀐 단어 또는이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

고마워요! 내가 선택한 범위의 저장의 어떤 종류를 만들기 위해 제안 할 수

인사말

답변

2

당신은 색상 속성을 찾기 때문 문자열을 반복 할 수 있습니다.

This{ 
    NSColor = "UIExtendedSRGBColorSpace 1 0 0 1"; 
} is { 
}a{ 
    NSColor = "UIExtendedSRGBColorSpace 1 0 0 1"; 
} test { 
}of{ 
    NSColor = "UIExtendedSRGBColorSpace 1 0 0 1"; 
} the following code{ 
} 

이 코드는 기인 문자열을 처리합니다

// This generates a test attributed string. 
// You actually want the attributedText property of your text view 
let str = NSMutableAttributedString(string: "This is a test of the following code") 
str.addAttributes([NSForegroundColorAttributeName:UIColor.red], range: NSMakeRange(0, 4)) 
str.addAttributes([NSForegroundColorAttributeName:UIColor.red], range: NSMakeRange(8, 1)) 
str.addAttributes([NSForegroundColorAttributeName:UIColor.red], range: NSMakeRange(15, 2)) 
print(str) 

위의 인쇄 :

추시 코드

는 방법을 보여줍니다. 전경색으로 포맷 된 텍스트의 모든 범위는 단어 배열에 저장됩니다.

var words = [String]() 
str.enumerateAttribute(NSForegroundColorAttributeName, in: NSMakeRange(0, str.length), options: []) { (value, range, stop) in 
    if value != nil { 
     let word = str.attributedSubstring(from: range).string 
     words.append(word) 
    } 
} 
print(words) 

이 인쇄 :

[ "이", "A", "의"] 제안에 대한

+0

감사합니다, 매력처럼 작동합니다! –

0

는, 당신은이 단어가 아닌 다른 방법의 모양을 사용자 정의 할 수있는이 범위를 기반으로. 전체 텍스트의 속성을 확인하지 않고도 매번 선택한 단어에 액세스 할 수 있습니다.

+0

감사합니다. 왜 내가 제안했는지 이해함에 따라, 필자는 프로젝트에서 전체 문자열을 한 번 반복하는 것이 중요하지 않기 때문에 다른 접근법을 고수하고 있습니다. –

0

난 당신의 Ranges을 저장해야합니다 귀하의 질문에 대답하는 그 Piotr에 동의하는 동안 :

attributedString.enumerateAttributes(in: NSMakeRange(0, attributedString.length), options: []) { attributes, range, _ in 
    if let color = attributes[NSForegroundColorAttributeName] as? UIColor, 
     color == YOUR_HIGHLIGHT_COLOR { 
     let nString = attributedString.string as NSString 
     let word = nString.substring(with: range) 
     // Do what you want with the word 
    } 
}