質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

1回答

2885閲覧

Realmを使用したTableViewで要素の並び替えをしたい[編集モードで]

pamipani

総合スコア11

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/04/10 13:02

編集2017/04/10 14:25

TableViewで要素を並び替えをしたいです。例としては以下のリンクのような事。

こういったModelを並べ替える

[ [id: 0,name: "猫"], [id: 1,name: "犬"], [id: 2,name: "猿"], [id: 3,name: "キジ"], [id: 4,name: "トラ"] ]

http://qiita.com/hirofumi_05/items/4a476f6861d921832b89

力技で一旦全削除して入れ直すなど終わらせるためだけの方法は思いつくのですが
もう少し簡単なベストプラクティスをご教授のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

順番を表すプロパティ(例えばorder)を追加すればいいんじゃないでしょうか?

[ [id: 0, order: 2, name: "猫"], [id: 1, order: 0, name: "犬"], [id: 2, order: 4, name: "猿"], [id: 3, order: 1, name: "キジ"], [id: 4, order: 3, name: "トラ"] ]

中央値を取る方法

Swift2の丸投げコードです。
セルはRight Detailで。

swift

1class TableViewController: UITableViewController { 2 3 var array = [ 4 ["id": 0, "order": 2.0, "name": "猫"], 5 ["id": 1, "order": 0.0, "name": "犬"], 6 ["id": 2, "order": 4.0, "name": "猿"], 7 ["id": 3, "order": 1.0, "name": "キジ"], 8 ["id": 4, "order": 3.0, "name": "トラ"], 9 ] 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 self.navigationItem.rightBarButtonItem = self.editButtonItem() 14 self.sortArray() 15 } 16 17 func sortArray() { 18 array = array.sort{($0["order"] as! Double) < ($1["order"] as! Double)} 19 } 20 21 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 22 return array.count 23 } 24 25 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 26 let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 27 let obj = array[indexPath.row] 28 cell.detailTextLabel!.text = "\(obj["order"]!)" 29 cell.textLabel!.text = obj["name"] as? String 30 return cell 31 } 32 33 override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { 34 35 print("from \(fromIndexPath.row) to \(toIndexPath.row)") 36 37 if fromIndexPath.row == toIndexPath.row { 38 print("skip") 39 } else { 40 var newOrder: Double 41 if toIndexPath.row == 0 { 42 //一番上に移動した場合は先頭セル - 1 43 newOrder = (array[toIndexPath.row]["order"] as! Double) - 1.0 44 } else if toIndexPath.row == array.count - 1 { 45 //一番下に移動した場合は末尾セル + 1 46 newOrder = (array[toIndexPath.row]["order"] as! Double) + 1.0 47 } else { 48 //途中に移動したときは上下セルの中央値 49 var rowPrev: Int, rowNext: Int; 50 if (toIndexPath.row < fromIndexPath.row) { 51 //上に移動した場合 52 rowPrev = toIndexPath.row - 1 53 rowNext = toIndexPath.row 54 } else { 55 //下に移動した場合 56 rowPrev = toIndexPath.row 57 rowNext = toIndexPath.row + 1 58 } 59 newOrder = ((array[rowPrev]["order"] as! Double) + (array[rowNext]["order"] as! Double)) / 2.0 60 } 61 array[fromIndexPath.row]["order"] = newOrder 62 63 self.sortArray() 64 tableView.reloadData() 65 } 66 } 67}

投稿2017/04/13 00:47

編集2017/04/19 02:03
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/04/13 00:54

リンク先見たら同じことしてました‥。
pamipani

2017/04/18 07:31 編集

回答ありがとうございます! リンク先の方法だとそれはそれでいいのですが もっと楽な方法があるかと思って投稿させていただきました。 今回の実装だとorderの番号を入れ替えただけだとずれてしまいます。 実際にやってみるとわかるのですが 例えば0番目を4番目の間に入れ替えたと同時にそのrange(範囲 1番目2番目3番目のorderをアップデート)の中身を判定してアップデートしないと実現しないため、具体的にはそのロジックが知りたいです。 その複雑な方法ならわかるのですがここではもう少しシンプルな回答をお待ちしております。 申し訳ありません。 このリンクが悩ませている事を説明してくれています。 http://www.kuma-de.com/blog/2012-09-22/4050 追記説明が足りていませんでした。 ただ並べ替えるのではなく TableViewの「編集」から三本線を掴んで直感的に並べ替えかえるやつです。
fuzzball

2017/04/18 07:06

唐突にrangeとか言われても意味分からないのですが。
fuzzball

2017/04/18 08:01

0番目と4番目を入れ替えた場合、0番目と4番目のorderを入れ替えて、0番目と4番目だけupdateすればいいと思うのですが、何か勘違いや理解不足があるでしょうか?
fuzzball

2017/04/18 08:53

あー、入れ替わるわけじゃないんですね。納得しました。
fuzzball

2017/04/18 09:23

思い付きの書き逃げです。 (その1) 移動したデータのorderを、移動先の前後のセルのorderの中央値にする。 (その2) リスト構造にする。 暇なときに考えてみます。
fuzzball

2017/04/19 02:04

Swift2ですが、その1を実装してみました。 orderの間隔が狭くなったときにリフレッシュする処理が必要ですね‥。
pamipani

2017/04/19 13:01

今回こういった配列ではなく 表題のRealmの問い合わせを使用した物をご教授いただきたく。申し訳ありません。
fuzzball

2017/04/19 16:32

問い合わせというのは何でしょうか? 移動したタイミングでdbのupdateをすれば良いのではないのでしょうか?
pamipani

2017/04/20 01:55

クエリですね。 なのでそのやり方をここで質問させていただいています。
pamipani

2017/04/20 02:30 編集

Realmの使い方を質問をしているわけではなく 表題の 「Realmを使用したTableViewで要素の並び替えをしたい[編集モードで]」 を質問しています。 質問内容にも >力技で一旦全削除して入れ直すなど終わらせるためだけの方法は思いつくのですが もう少し簡単なベストプラクティスをご教授のほどよろしくお願いいたします。 と記載しております。
fuzzball

2017/04/20 02:36 編集

「TableViewで要素の並び替え」と「Realmの更新」が出来れば解決するのでは?どうやって組み合わせるのかが分からないのでしょうか?
pamipani

2017/04/20 02:36

よく読んでもらいたいのは >力技ではなくもう少し簡単なベストプラクティス Realmでのセオリーがわからないのでここで質問しているのです。
fuzzball

2017/04/20 02:37

「移動したセルのデータだけを更新する」というやり方は「簡単」ではないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問