iOS: メンション入力/表示の実装手法(2)

p0dee
May 8, 2021

--

前回の続き。以下の実装方針を採用した。

  • プロフィール名表示 + ユーザー変更に追従する
    → DBに保存するメッセージ文字列に、メンション箇所を示す文字列を埋め込み、表示時は正規表現により該当箇所を抽出
  • カーソル操作/削除操作いずれも1文字扱いとする
    → メンション表示にNSTextAttachmentを使用

今回は、前者について説明する。

たとえば、次の画像のような文字列があった場合、

DB上の文字列も直感的には@はなこさん、こんにちは。となりそうだが、これでは次の問題がある。

  • メンション表示の文字列範囲が正確にわからない
  • はなこさんが自分の表示名を変更した場合、その変更に追従できない

そこで、以下のアイデアを取り入れる必要がある。

  • 文字列範囲がわからない→メンション該当箇所を独自の表記に置き換える
  • プロフィール名変更に追従できない→ユーザーに一意かつ不変の内部IDを使用する

手っ取り早い話、これらを組み合わせるとDB上の文字列は次のようになる。

「#user:4Fj4m2dUw#さん、こんにちは。」

メンション表示を #user:{user_id}#として内部的に表現することにより、表示箇所が明確になり、かつユーザー変更にも追従可能となる。

あとはメッセージ入力/表示時に、これを正規表現で抽出し、然るべき表示に置き換えれば良い。

#user:{user_id}#を抽出する正規表現は#user:[^#]*#なので、例えばメンション表示を文字列@ユーザー名とする場合を例に取ると、以下のように実装になる。

次回はメンション表示をカーソル操作上1文字扱いするために、NSTextAttachmentを用いて表現する方法について。

実装の全体像はこちら。

--

--

No responses yet