#質問したいこと
こんにちは。お世話になっております。
現在、Realmを使用したTodoアプリを作成しております。
今まではUserdefaultsを使用していた部分をRealmで保存したいのですが、
タイトルにもあるように、
Index 0 is out of bounds (must be less than 0).
とエラーが出て落ちてしまいます。
カレンダー(FSCalendar)を使用したアプリなのですが、一番最初にtodoを保存した時にカレンダーで日付を選択しても落ちないのですが、次に保存する時に、最初に保存した時と日付が違うと、2回目に保存したtodoの日付をカレンダー上で選択すると、落ちてしまいます。
例)
①2021/2/5にtodoを保存
②カレンダー2021/2/5を選択
③問題なくtableViewに表示される
④2021/2/10にtodoを保存(保存は問題なくできています)
⑤カレンダー2021/2/10を選択
⑥**Index 0 is out of bounds (must be less than 0).**というエラーが出て落ちる。
#コード
Swift
1//ViewController 2import UIKit 3import FSCalendar 4import RealmSwift 5class ViewController: UIViewController,FSCalendarDelegate,FSCalendarDataSource,FSCalendarDelegateAppearance, UIScrollViewDelegate, UIGestureRecognizerDelegate{ 6var ImItems: Results<ImportantDate>! 7 8private var dataSource: [AddDate] = [AddDate]() { 9 didSet { 10 contentVC.tableView.reloadData() 11 } 12 } 13func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 14 if indexPath.section == 0 { 15 let cell = tableView.dequeueReusableCell(withIdentifier: ImportantDayTableViewCell.reuseIdentifier, for: indexPath) as! ImportantDayTableViewCell 16 guard let count = ImItems?.count, indexPath.row < count else { return cell } 17 try! realm.write{ 18 ImItems[indexPath.row].title = self.dataSource[indexPath.row].title 19 ImItems[indexPath.row].dateDescription = self.dataSource[indexPath.row].content 20 ImItems[indexPath.row].date = self.dataSource[indexPath.row].date 21 ImItems[indexPath.row].pin = self.dataSource[indexPath.row].pin 22 if memo.pin == true { 23 cell.setupCell(title: self.ImItems[indexPath.row].title, 24 content: self.ImItems[indexPath.row].dateDescription, 25 date: self.ImItems[indexPath.row].date, 26 pin: false) 27 } 28 if memo.pin == false { 29 cell.setupCell(title: self.ImItems[indexPath.row].title, content: self.ImItems[indexPath.row].dateDescription, date: self.ImItems[indexPath.row].date, pin: true) 30 31 } 32 33 return cell 34 } 35 } 36}
Swift
1//Realmで新しく保存するモデル 2import Foundation 3import RealmSwift 4 5class ImportantDate: Object { 6 7 @objc dynamic var title: String = "" 8 @objc dynamic var dateDescription: String = "" 9 @objc dynamic var date = String() 10 @objc dynamic var pin: Bool = false 11}
Swift
1//Userdefaultsで保存してた時のモデル 2import Foundation 3 4struct AddDate: Codable { 5 var title: String 6 var content: String 7 var date: String 8 var pin: Bool 9} 10
2ヶ月ほど悩んでいるのですが、なかなか解決できていません。
よろしくお願いいたします。
#追記
Swift
1func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 2 if ImItems == nil { 3 return 0 4 } else { 5 return ImItems.count 6 } 7 }
FSCalendarで日付をタップした際
Swift
1func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 2 let tmpDate = Calendar(identifier: .gregorian) 3 let year = tmpDate.component(.year, from: date) 4 let month = tmpDate.component(.month, from: date) 5 let day = tmpDate.component(.day, from: date) 6 7 UserDefaults.standard.set(year, forKey: "year") 8 UserDefaults.standard.set(month, forKey: "month") 9 UserDefaults.standard.set(day, forKey: "day") 10 let formatter = DateFormatter() 11 formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yyyy/M/d", options: 0, locale: Locale(identifier: "ja_JP")) 12 let dateStr = formatter.string(from: date) 13 dateLabel.text = dateStr 14 UserDefaults.standard.set(dateLabel.text, forKey: "date") 15 print("calendar dateStr: (dateStr)") 16 let realm = try! Realm() 17 self.ImItems = realm.objects(ImportantDate.self).filter("date == %@", dateStr) 18 self.items = realm.objects(Event.self).filter("date == %@", dateStr) 19 20 contentVC.tableView.reloadData() 21 22 let dateUdf = UserDefaults.standard.object(forKey: "date") as! String 23 let dateUtils = DateUtils.dateFromString(string: dateUdf, format: "yyyy/M/d") 24 weekCalendar.select(dateUtils) 25 }
回答1件
あなたの回答
tips
プレビュー