최신 정보:
내 질문에는 두 가지 주요 부분이 있습니다.
- 클릭 가능한 링크에 대해 표시되는 텍스트가 호출 된 실제 링크와 다른 위치에 링크를 만드는 방법 :
- 사용자 정의 코드를 사용하지 않고 링크를 설정하여 텍스트의 속성을 설정하는 방법
iOS 7은에서 텍스트를 불러오는 기능을 추가 한 것으로 나타났습니다 NSData
.
의 사용자 정의 하위 클래스를 만들었습니다. UITextView
활용 .@IBInspectable
속성을 RTB 파일의 컨텐츠를 IB에 직접로드 할 수 있습니다. 파일 이름을 IB에 입력하면 사용자 정의 클래스가 나머지를 수행합니다.
세부 사항은 다음과 같습니다.
iOS 7에서는 NSAttributedString
방법을 얻었습니다 initWithData:options:documentAttributes:error:
. 이 메소드를 사용하면 NSData 객체에서 NSAttributedString을로드 할 수 있습니다. 먼저 RTF 파일을 NSData initWithData:options:documentAttributes:error:
에로드 한 다음 해당 NSData를 텍스트보기에로드하는 데 사용할 수 있습니다. initWithFileURL:options:documentAttributes:error:
파일에서 직접 기여 문자열을로드하는 메소드도 있지만 해당 메소드는 iOS 9에서 더 initWithData:options:documentAttributes:error:
이상 사용되지 않습니다. 더 이상 사용되지 않는 method를 사용하는 것이 더 안전합니다 .
사용중인 링크에 특정한 코드를 만들지 않고도 텍스트보기에 클릭 가능한 링크를 설치할 수있는 방법을 원했습니다.
내가 생각해 낸 해결책은 내가 호출하는 UITextView의 사용자 정의 하위 클래스를 만들고 라는 속성을 RTF_UITextView
제공하는 것이 었습니다 . 속성에 속성을 추가 하면 인터페이스 빌더가 해당 속성을 "속성 관리자"에 노출시킵니다. 그런 다음 사용자 정의 코드를 사용하여 IB에서 해당 값을 설정할 수 있습니다.@IBInspectable
RTF_Filename
@IBInspectable
또한 @IBDesignable
사용자 정의 클래스에 속성을 추가했습니다 . 이 @IBDesignable
속성은 Xcode에 실행중인 사용자 정의보기 클래스 사본을 인터페이스 빌더에 설치하여보기 계층의 그래픽 표시에서 볼 수 있도록합니다. 불행히도,이 클래스의 경우 @IBDesignable
속성이 벗겨진 것 같습니다. 처음 추가했을 때 효과가 있었지만 텍스트보기의 일반 텍스트 내용을 삭제했는데보기의 클릭 가능한 링크가 사라져서 다시 가져올 수 없었습니다.)
내 코드 RTF_UITextView
는 매우 간단합니다. 가산 이외에 @IBDesignable
특성 및 RTF_Filename
속성과 @IBInspectable
특성을, I는 추가 didSet()
받는 방법 RTF_Filename
속성. didSet()
방법은 값 언제든지 호출되는 RTF_Filename
속성 변경. 이 didSet()
방법 의 코드 는 매우 간단합니다.
@IBDesignable
class RTF_UITextView: UITextView
{
@IBInspectable
var RTF_Filename: String?
{
didSet(newValue)
{
//If the RTF_Filename is nil or the empty string, don't do anything
if ((RTF_Filename ?? "").isEmpty)
{
return
}
//Use optional binding to try to get an URL to the
//specified filename in the app bundle. If that succeeds, try to load
//NSData from the file.
if let fileURL = NSBundle.mainBundle().URLForResource(RTF_Filename, withExtension: "rtf"),
//If the fileURL loads, also try to load NSData from the URL.
let theData = NSData(contentsOfURL: fileURL)
{
var aString:NSAttributedString
do
{
//Try to load an NSAttributedString from the data
try
aString = NSAttributedString(data: theData,
options: [:],
documentAttributes: nil
)
//If it succeeds, install the attributed string into the field.
self.attributedText = aString;
}
catch
{
print("Nerp.");
}
}
}
}
}
@IBDesignable 속성을 사용하여 인터페이스 빌더에서 스타일이 지정된 텍스트를 미리 볼 수 없으면 위의 코드를 사용자 정의 서브 클래스가 아닌 UITextView의 확장으로 설정하는 것이 좋습니다. 이렇게하면 텍스트보기를 사용자 정의 클래스로 변경하지 않고도 모든 텍스트보기에서 사용할 수 있습니다.
iOS 7 이전의 iOS 버전을 지원해야하는 경우 다른 답변을 참조하십시오.
gitHub에서이 새 클래스가 포함 된 샘플 프로젝트를 다운로드 할 수 있습니다.
Github의 DatesInSwift 데모 프로젝트