前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー