スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Swift】hashタグやメンションをUITextViewでクリックできるようにする

下記のサイトに方法が書いてあるのでこの通りに進めればいい。
https://github.com/ThornTechPublic/SwiftTextViewHashtag

とはいえ、英語なのと少々説明不足な部分があるので下記にまとめたい。


UITextViewにはもともとリンクを検出してクリッカブルにする機能が備わっているのはご存知の通りだ。
この機能を利用し、ハッシュタグをURLのリンクのように偽ってクリッカブルにし、さらに、クリックした後の動作も定義しようとするのが上記の記事のソリューションだ。
細かい説明は割愛するが、必要なステップは下記の通りだ。

1. 対象となるUITextViewを設置し、Delegateを設定する
ストーリーボードで行う場合はコントロールキーを押しながらUITextViewをドラッグして、親のViewの黄色い四角に接続する。
コードでやる場合は

self.myTextView.delegate = self


などとする


2. 1のUITextViewは下図のように設定する(もちろんコード上で行ってもいい)
UITextViewStoryboard.png


3. 新しいSwiftのファイルを作成してこちらのコードを入力
このコードは「ハッシュタグをURLのリンクのように偽ってクリッカブルにする」部分を担う


4. 3をUITextViewに入力された文字列に適用
下記のようにする。ここまでできれば対象のtextviewに表示されたハッシュタグがリンクと同じようにクリッカブルになる。

myTextView.text = "hello #world"
myTextView.resolveHashTags()




5. クリックされた後の処理を定義
下記のように定義する。

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
if let scheme = URL.scheme {
switch scheme {
case "hash" :
println("hash")
case "mention" :
println("mention")
default:
println("just a regular url")
}
}
return true
}






結構ざっくりな説明になったが、上記の記事でサンプルのプロジェクトを公開してくれているのでそちらをダウンロードして中身を覗いてみるのが早いだろう。

【追記】
上記のサンプルで紹介しているコードには2015年7月27日現在バグがある。
例えば

helloworld #helloworld

のような文字列を入力すると、下記のようになってしまう。

helloworld #helloworld

これはハッシュタグと同じ文字列が前方に出現する可能性を考えていないために起こるバグだ。
下記のように修正すればこのバグは解消される。

【誤】

var matchRange:NSRange = nsText.rangeOfString(stringifiedWord as String)
matchRange.location--
matchRange.length++




【正】

var matchRange:NSRange = nsText.rangeOfString("#" + stringifiedWord as String)
//matchRange.location--
//matchRange.length++



上記の修正でもまだバグ(仕様?)があり、日本語のハッシュタグだと上手く機能しない。
日本語にも対応させるためにはハッシュタグを一度URLエンコーディングするのがいいだろう。
例えば下記のようにする。

let hashtagURLEncoding = stringifiedWord.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
attrString.addAttribute(NSLinkAttributeName, value: "\(scheme):\(hashtagURLEncoding)", range: matchRange)

コメント

コメントの投稿

非公開コメント

PR

PR

プロフィール

何でも書くman

Author:何でも書くman
思ったことや備忘録など、とりあえずなんでも書きます。IT系のことや趣味、生活に関わることなども。

ページの先頭へ戻る
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。