社畜系WEBエンジニアの消耗戦

読者です 読者をやめる 読者になる 読者になる

社畜系WEBエンジニアの消耗戦

修羅の国でせっせと働く社畜系WEBエンジニアのブログ

UITextView内にaタグでリンクを貼った文字列を突っ込んでsafariで開く

Swift

HTMLならあっという間にできることも、Swiftとなると一気に難しい。(というかSwift初心者なだけです。)

下準備

StoryboardかXibにUITextViewを配置して@IBOutletで繋ぐ。

@IBOutlet weak var textView: UITextView!

各種プロパティの設定

ここの設定、重要。僕はここの設定がちょこっと違っていて、タップイベントが発火しないという事態に見舞われて半日くらいを費やした。ドヤッ

textView.userInteractionEnabled = true;
textView.dataDetectorTypes = .Link;
textView.scrollEnabled = false;
textView.editable = false;
textView.selectable = true;
textView.delegate = self;

NSAttributedStringを作る

エラーハンドリングはよしなにしてください。

let htmlText = "Googleは<a href=\"http://google.com\"><strong>こちら</strong></a>"
let htmlData = htmlText.dataUsingEncoding(NSUTF8StringEncoding)!
let options:[String:AnyObject] = [
        NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
        NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding,
    ]
let attributedText = try! NSAttributedString(data: htmlData, options: options, documentAttributes: nil)

完成形

これで、「こちら」のテキストにリンクが貼られて、タップ時にsafariが起動します。

@IBOutlet weak var hogehoge: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()

    self.hogehoge = setTextViewProperties(self.hogehoge)

    let htmlText = "Googleは<a href=\"http://google.com\"><strong>こちら</strong></a>"
    hogehoge.attributedText = getAttributedText(htmlText)
}

func setTextViewProperties(textView: UITextView) -> (UITextView) {
    textView.userInteractionEnabled = true
    textView.dataDetectorTypes = .Link
    textView.scrollEnabled = false
    textView.editable = false
    textView.selectable = true
    textView.delegate = self
    return textView
}
    
func getAttributedText(htmlText: String) -> (NSAttributedString) {
    let htmlData = htmlText.dataUsingEncoding(NSUTF8StringEncoding)!
    let options:[String:AnyObject] = [
            NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,
            NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding,
        ]
    let attributedText = try! NSAttributedString(data: htmlData, options: options, documentAttributes: nil)
    return attributedText
}

参考

以下のサイトを参考にさせていただきました。

qiita.com

stackoverflow.com