スワイプ時に削除以外にも動作を設定(UITableView)

ちょっとしたコードや設定などですが、忘れがちであらためて調べるのも面倒なので、忘備録的なものです。
順不同で、気づいたものから順にSwift4で使えるコードを載せていきます。

Swift-Tips

スワイプ時に削除以外にも動作を設定

テーブルビューの行を左スワイプした時に「削除」以外の複数の処理を選択できるようにする
下記は処理として以下を追加したもの。
・「メール」:メール送信 (MFMailComposeViewControllerDelegate追加)
・「エキスポート」:他のアプリにデータを渡す(UIDocumentInteractionControllerDelegate追加)


var documentInteraction:UIDocumentInteractionController? = nil // スワイプ時に削除以外にも動作を設定 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let mailTitle:String = NSLocalizedString("Mail", tableName: "Message", comment: "メール") let mail: UITableViewRowAction = UITableViewRowAction(style: .normal, title: mailTitle) { (action, index) -> Void in self.exportByMail(indexPath.row) } mail.backgroundColor = NC_173_KAMENOZOKI let exportTitle:String = NSLocalizedString("Export", tableName: "Message", comment: "エキスポート") let export: UITableViewRowAction = UITableViewRowAction(style: .normal, title: exportTitle) { (action, index) -> Void in self.exportEntry(indexPath.row) } export.backgroundColor = NC_186_SORA let deleteTitle:String = NSLocalizedString("Delete", tableName: "Message", comment: "削除") let delete: UITableViewRowAction = UITableViewRowAction(style: .normal, title: deleteTitle) { (action, index) -> Void in self.removeConfirm(indexPath.row) } delete.backgroundColor = NC_014_KARAKURENAI return [export, mail, delete] } func exportByMail(_ index:Int) { if !MFMailComposeViewController.canSendMail() { // メール送信不可 print("Mail can't be send") return } let csvString:String = appDl.entries[index].texts2CSV() let mailVC = MFMailComposeViewController() let toRecipients:[String] = [""] //Toのアドレス指定 mailVC.mailComposeDelegate = self mailVC.setSubject("Repeat after YOU!: Data export(テキストデータエクスポート)") mailVC.setToRecipients(toRecipients) let mailMessage = "テキストデータをCSV形式で添付します。\nExport the data with csv format.\n \n -- Repeat after YOU! --" mailVC.setMessageBody(mailMessage, isHTML: false) mailVC.addAttachmentData(csvString.data(using: String.Encoding.shiftJIS, allowLossyConversion: false)!, mimeType: "text/csv", fileName: "Export_output.csv" ) self.present(mailVC, animated: true, completion:nil) } func exportEntry(_ index:Int) { let csvString:String = appDl.entries[index].texts2CSV() let tempPath = NSTemporaryDirectory() as String let filePath = tempPath + "output.csv" print(filePath) print(csvString) let tmpUrl = URL(fileURLWithPath: filePath) do { try csvString.write(to: tmpUrl, atomically: true, encoding: .shiftJIS) } catch { print("File write error:",filePath) return } documentInteraction = UIDocumentInteractionController(url: tmpUrl) documentInteraction!.delegate = self documentInteraction!.uti = "public.text" if !documentInteraction!.presentOpenInMenu(from: self.view.frame, in: self.view, animated: true) { print("File send error") // 送信できるアプリが見つからなかった時の処理 let alert = UIAlertController( title: NSLocalizedString("Alert!", tableName: "Message",comment: "注意!"), message: NSLocalizedString("send-fail-message", tableName: "Message",value: "Failed to send.", comment: "ファイルを送れるアプリが見つかりません"), preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } } @objc func documentInteractionController(_ controller: UIDocumentInteractionController, willBeginSendingToApplication application: String?) { print("Start file sending to ",application ?? "") } @objc func documentInteractionController(_ controller: UIDocumentInteractionController, didEndSendingToApplication application: String?) { print("Complete file sending to ",application ?? "") }