前提・実現したいこと
ToDoアプリのTableViewCellを編集モードを使わずに並べ替えたいのですが、上手くいきません。
以下のサイトを参考にしたのですが、配列arrayに入れたタスク(文字列)をドラッグアンドドロップで並べ替えられるようにするにはどのようにコードを書き換えれば良いでしょうか。
発生している問題・エラーメッセージ
該当のソースコード
swift
1import UIKit 2 3class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UINavigationControllerDelegate,UITableViewDragDelegate,UITableViewDropDelegate { 4 5 6 //セクションの数を指定 7 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 8 9 return array.count 10 } 11 12 13 14 //生成したセルを順番に表示 15 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 16 17 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 18 //Table View CellのidentifireをCellとする 19 20 cell.textLabel?.text = array[indexPath.row] 21 cell.layer.backgroundColor = UIColor.clear.cgColor 22 return cell 23 } 24 25 //セルの移動許可 26 func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 27 return true 28 } 29 30 //セルを移動した時の処理 31 func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { 32 // TODO: 入れ替え時の処理を実装する(データ制御など) 33 34 } 35 36 37 38 39 @IBOutlet var tableView: UITableView! 40 41 //todoを入れる配列 42 43 var array = [String]() 44 45 override func viewDidLoad() { 46 super.viewDidLoad() 47 tableView.delegate = self 48 tableView.dataSource = self 49 tableView.dragDelegate = self 50 tableView.dropDelegate = self 51 tableView.dragInteractionEnabled = true 52 //現在の配列を取り出す 53 if (UserDefaults.standard.object(forKey: "todo") != nil){ 54 array = UserDefaults.standard.object(forKey: "todo") as! [String] 55 } 56 57 self.tableView.reloadData() 58 59 } 60 61 //セルのドラッグ処理 62 func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { 63 //????? 64 return [?????.dragItem (for: indexPath)] 65 } 66 67 68 func dragItem(for indexPath: IndexPath) -> UIDragItem { 69 //????? 70 let task = array[indexPath.row] 71 let itemProvider = NSItemProvider(object: task as NSString) 72 73 return UIDragItem(itemProvider: NSItemProvider()) 74 } 75 76 77 //セルのドロップ 78 func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, 79 withDestinationIndexPath destinationIndexPath: IndexPath?) -> UITableViewDropProposal { 80 return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath) 81 } 82 83 func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) { 84 guard let item = coordinator.items.first, 85 let destinationIndexPath = coordinator.destinationIndexPath, 86 let sourceIndexPath = item.sourceIndexPath else { return } 87 88 tableView.performBatchUpdates({ [weak self] in 89 guard let strongSelf = self else { return } 90 //???? 91 strongSelf.array.moveItem(sourcePath: sourceIndexPath.row, destinationPath: destinationIndexPath.row) 92 tableView.deleteRows(at: [sourceIndexPath], with: .automatic) 93 tableView.insertRows(at: [destinationIndexPath], with: .automatic) 94 }, completion: nil) 95 coordinator.drop(item.dragItem, toRowAt: destinationIndexPath) 96 } 97 98 99 func moveItem(sourcePath: Int, destinationPath: Int) { 100 let moveTask = array.remove(at: sourcePath) 101 array.insert(moveTask, at: destinationPath) 102 } 103 104 105 106 //ここから下のコードはうまく動いている↓
試したこと
参考サイト
UITableViewのdragDelegate, dropDelegateについて調べて試した
補足情報(FW/ツールのバージョンなど)
他におかしい箇所があればご教示いただけますと幸いです。
よろしくお願いします。