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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

1回答

3406閲覧

RealmSwiftのListがソートできない。

kizahashi

総合スコア17

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2018/10/18 02:56

編集2018/10/19 04:37

前提・実現したいこと

Swift4でRealmを使ったタスクアプリを作成しているのですが
RealmのList<>の型でソートをすることができません

textFieldに入力したタスクとその入力時刻をfunc textFieldShouldReturnのところでTaskList.listに追加しています。

そしてcellForRowAt内で

sortedTaskResult = realm.objects(Task.self).sorted(byKeyPath: "date", ascending: false)

という感じにしてタスクを入力時刻順でソートしようとを試みているのですが
sortedTaskResultを出力してみると中身は空になってしまっています。

どうすればTaskList.listをソートできるのでしょうか
そもそもRealmでArrayを保存しソートできるような状態でTableViewに表示したい場合はどうするのがスタンダードなのでしょうか?

数日間苦戦していてとても困っております
御回答よろしくお願いいたします。

発生している問題・エラーメッセージ

'RLMException', reason: 'Index 0 is out of bounds (must be less than 0).'

該当のソースコード

SWIFT

1import Foundation 2import RealmSwift 3 4class Task: Object{ 5 @objc dynamic var name: String! 6 @objc dynamic var date = "2018/10/18 12:00" 7} 8class TaskList: Object { 9 let list = List<Task>() 10 @objc dynamic var name: String! 11 @objc dynamic var date = "2018/10/18 12:00" 12}

SWIFT

1import UIKit 2import RealmSwift 3 4class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UITextViewDelegate,UITextFieldDelegate,TestDelegate{ 5 6 var numberOfcells = 0 7 var cellNumberArray:[Int] = [] 8 9 private var realm: Realm! 10 private var sortedTaskResult: Results<Task>! 11 12 let taskList = TaskList() 13 14 15 @IBOutlet weak var vcTextField: UITextField! 16 @IBOutlet weak var myTableView: UITableView! 17 @IBOutlet weak var label1: UILabel! 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 realm = try! Realm() 23 } 24 25 26 27 func textFieldShouldReturn(_ textField: UITextField) -> Bool{ 28 vcTextField.resignFirstResponder() 29 30 let inputText = vcTextField.text 31 32 numberOfcells += 1 33 cellNumberArray.insert(numberOfcells, at: cellNumberArray.startIndex) 34 35 let now = NSDate() 36 let formatter = DateFormatter() 37 formatter.dateFormat = "yyyy/MM/dd H:mm:ss" 38 let string = formatter.string(from: now as Date) 39 40 let task = Task() 41 42 task.name = "(inputText!)"//入力したタスクを追加 43 task.date = "(string)"//入力時刻を追加 44 45 taskList.list.append(task) 46 if cellNumberArray.count == 0{ 47 taskList.list.append(task)} //なぜかTasklist.listの中が1つだと表示されないので初回だけ二回 48 49 50 vcTextField.text = "" 51 52 myTableView.reloadData() 53 return true 54 } 55 56 57 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 58 59 return cellNumberArray.count 60 } 61 62 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 63 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell 64 65 sortedTaskResult = realm.objects(Task.self).sorted(byKeyPath: "date", ascending: false) 66 67 68 cell.textLabel?.text = "(cellNumberArray[indexPath.row])" 69 cell.taskLabel.text = taskList.list[indexPath.row].name 70 cell.dateLabel.text = taskList.list[indexPath.row].date 71 72 return cell 73 } 74 75 func deleteTodoItem2() { 76 try! realm.write { 77 realm.deleteAll() 78 79 } 80 } 81 82 @IBAction func dataSent(_ sender: Any) { 83 84 label1.text = "レルムデータ全削除" 85 86 deleteTodoItem2() 87 } 88}

補足情報(FW/ツールのバージョンなど)

Swift4.1

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

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

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

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

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

fuzzball

2018/10/19 00:15

cellArrayというのは何でしょうか?エラーはどこで出ているのでしょうか?なぜtableView(_:cellForRowAt:)の中でソートしているのでしょうか?sortedTaskResultを使っているところが無いのですが?
kizahashi

2018/10/19 04:40

すみません不完全でした tableView(_:cellForRowAt:)以外でもソートできるのですね。
guest

回答1

0

自己解決

タスクアプリを作るのであればList<>は必ずしも必要というわけではありませんでした

class taskAndDateData: Object { @objc dynamic var date = "" @objc dynamic var task = "" }
func saveData(task1: String,date1: String){ let data = taskAndDateData() data.task = task1 data.date = date1 try! self.realm.write { self.realm.add(data) }

このように普通に書き込んだだけでもデータが追加されるので
あとは

let data = self.realm.objects(taskAndDateData.self).sorted(byKeyPath: "date", ascending: false)

でソートしたものを[indexpath.row].dateで表示しました

投稿2018/10/19 04:52

kizahashi

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問