[iOS] MessageKitでチャットの長押しを実装する
チャットの長押しをして、通報というのを新たに追加したかったのだが、例によってMessageKitのマニュアルにはのってなかったのでやり方のメモ。
基本的には、MessageKitはUICollectionViewを継承してるので、UICollectionViewの長押しの設定と同じようなことをやればよい。
cf: Delete message by long press on cell ? #706
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
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はいろいろできるけどいろいろと自分で工夫しないと行けない点がたくさんです。