更新:
私の質問には2つの重要な部分がありました:
- クリック可能なリンクに表示されるテキストが、呼び出される実際のリンクと異なるリンクを作成する方法:
- テキストに属性を設定するためにカスタムコードを使用せずにリンクを設定する方法。
iOS 7が属性付きテキストをからロードする機能を追加したことがわかりましたNSData
。
UITextView
この@IBInspectable
属性を利用して、RTFファイルからコンテンツを直接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:
廃止されました。廃止されなかったメソッドを使用する方が安全です。
使用しているリンクに固有のコードを作成せずに、クリック可能なリンクをテキストビューにインストールできる方法が必要でした。
私が思いついた解決策は、呼び出すUITextViewのカスタムサブクラスを作成し、それにと呼ばれるプロパティRTF_UITextView
を与えることでした。プロパティに属性を追加すると、Interface Builderは「属性インスペクター」でそのプロパティを公開します。その後、カスタムコードを使用してIBからその値を設定できます。@IBInspectable
RTF_Filename
@IBInspectable
また@IBDesignable
、カスタムクラスに属性を追加しました。この@IBDesignable
属性は、カスタムビュークラスの実行中のコピーをInterface Builderにインストールして、ビュー階層のグラフィック表示で確認できるようにすることを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デモプロジェクト