Categories: iOS

[iOS] MessageKitでチャットの長押しを実装する

チャットの長押しをして、通報というのを新たに追加したかったのだが、例によってMessageKitのマニュアルにはのってなかったのでやり方のメモ。

基本的には、MessageKitはUICollectionViewを継承してるので、UICollectionViewの長押しの設定と同じようなことをやればよい。
cf: Delete message by long press on cell ? #706

class ViewController: MessagesViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 新しくロングタップメニューを追加する
        let reportMenuItem = UIMenuItem(title: "通報", action: #selector(MessageCollectionViewCell.report(_:)))
        UIMenuController.shared.menuItems = [reportMenuItem]
    }

    // ロングタップで表示するメニューの設定
    override func collectionView(_ collectionView: UICollectionView, canPerformAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
        // actionは結構色んな種類(cooy, deleteなど)がデフォルトで定義されているので必要であればtrueにすればメニューに表示されるようになる
        switch action {
        case NSSelectorFromString("report:"):
            return true
        default:
            return super.collectionView(collectionView, canPerformAction: action, forItemAt: indexPath, withSender: sender)
        }
    }

    // メニューをタップして発火されるイベントの設定
    override func collectionView(_ collectionView: UICollectionView, performAction action: Selector, forItemAt indexPath: IndexPath, withSender sender: Any?) {
        switch action {
        case NSSelectorFromString("report:"):
            // ここで通報処理する
        default:
            super.collectionView(collectionView, performAction: action, forItemAt: indexPath, withSender: sender)
        }
    }

}

extension MessageCollectionViewCell {
    // イベント発火させるためのメソッド
    @objc func report(_ sender: Any?) {
        // Get the collectionView
        if let collectionView = self.superview as? UICollectionView {
            // Get indexPath
            if let indexPath = collectionView.indexPath(for: self) {
                // Trigger action
                collectionView.delegate?.collectionView?(collectionView, performAction: NSSelectorFromString("report:"), forItemAt: indexPath, withSender: sender)
            }
        }
    }
}

MessageKitはいろいろできるけどいろいろと自分で工夫しないと行けない点がたくさんです。

mogmet

View Comments