はじめに
こんにちは、nukkyです。
今回は、UITableViewでセルを入れ替えたい際に、ドラッグ&ドロップ操作を簡単に実装できるライブラリ「SwiftReorder」を紹介したいと思います。
準備
今回はCocoaPodsを使いたいと思います。
Podfileに以下を追加してください。
1 | pod'SwiftReorder','~> 3.0' |
追加したらターミナルから以下のコマンドを実行してください。
1 | pod install |
実装
まずは「SwiftReorder」をインポートします
1 | importSwiftReorder |
テーブルビューを実装したいコントローラーに以下を継承します
1 | classViewController:UIViewController,UITableViewDelegate,UITableViewDataSource{ |
StoryboardにUITableViewを設置し、コード上のIBOutletに紐づけてください
1 | @IBOutlet weakvartableView:UITableView! |
UITableViewのセルに表示するテキストを宣言します
今回は並べ替えがわかりやすい様にナンバリングしたいと思います
1 | varitems=(1...10).map{"Item \($0)"} |
tableViewの初期化をViewDidLoadで行います
1 2 3 4 5 6 7 | // SwiftReorderのTableViewReorderDelegate tableView.reorder.delegate=self // delegateの初期化 tableView.dataSource=self tableView.delegate=self // セルの初期化 tableView.register(UITableViewCell.self,forCellReuseIdentifier:"Cell") |
UITableViewのrowとSectionを設定をします
1 2 3 4 5 6 7 8 | functableView(_tableView:UITableView,numberOfRowsInSection section:Int)->Int{ returnitems.count } funcnumberOfSections(intableView:UITableView)->Int{ return1 } |
セルの表示を設定します、ここで先ほど宣言したitemsを表示する様にします
また、表示が更新されない様にドラッグされているセルを最初に返します
1 2 3 4 5 6 7 8 9 10 | functableView(_tableView:UITableView,cellForRowAt indexPath:IndexPath)->UITableViewCell{ // ドラッグされているセルを返す ifletspacer=tableView.reorder.spacerCell(for:indexPath){ returnspacer } letcell=tableView.dequeueReusableCell(withIdentifier:"Cell",for:indexPath) cell.textLabel?.text=items[indexPath.row] returncell } |
extensionでTableViewReorderDelegateを設定します
ここでドラッグ中のセルの更新処理を書いてます
1 2 3 4 5 6 7 8 | extensionViewController: TableViewReorderDelegate{ functableView(_tableView:UITableView,reorderRowAt sourceIndexPath:IndexPath,todestinationIndexPath:IndexPath){ // Update data model letitem=items[sourceIndexPath.row] items.remove(at:sourceIndexPath.row) items.insert(item,at:destinationIndexPath.row) } } |
sourceIndexPathにドラッグ中のセルのindexPathが、
destinationIndexPathに移動先のindexPathが入っているので
その情報に習ってmodelを入れ替えています。
実行すると、以下の様な動きができるようになっていると思います
さいごに
「SwiftReorder」いかがでしょうか、
この様な動きを自前で用意するのは面倒なので、ここまで簡単に実装できると便利だと思います。