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

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

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

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

Q&A

解決済

1回答

380閲覧

navigationTitleの日付操作について

tom0708

総合スコア7

Swift

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

0グッド

0クリップ

投稿2020/01/12 05:31

ボールドテキスト### 前提・実現したいこと

質問
swiftで、tableviewで記録画面を作成し、view controllerのnavigationTitleに現在の日付を表示させています。
さらに、navigationBarItemに[前日],[翌日]というボタンを配置し、タップすることにより、日付の操作ができるようにして、日付ごとに、realmで記録されたデータを管理したいのですが、日付の操作で詰まってしまいました。
現在の日付が基準になっているのか、前日ボタンをタップすると、現在日の1日前の
日付が表示されますが、再度タップしてもそれ以上前の日付は表示されません。
また、現在日より前の日付が表示された状態で、翌日ボタンをタップしても、現在日が表示されずに、現在の1日後の日付が表示されてしまいます。

初学者故説明が下手なのはご容赦ください。
アドバイスお願い致します。

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

エラーなし

swift

1 2import UIKit 3import RealmSwift 4 5class RecordViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UINavigationControllerDelegate { 6 7 8 @IBOutlet var babyNameLabel: UINavigationItem! 9 10 @IBOutlet var tableView: UITableView! 11 12 @IBOutlet var labelToday: UINavigationItem! 13 14 @IBOutlet var yesterdayLabel: UIBarButtonItem! 15 16 @IBOutlet var tomorrowLabel: UIBarButtonItem! 17 18 19 var todoItems: Results<Record>! 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 24 self.tableView.dataSource = self 25 self.tableView.delegate = self 26 27 let realm = try! Realm() 28 todoItems = realm.objects(Record.self) 29 tableView.reloadData() 30 31 32 labelToday.title = getToday() 33 34 print(Realm.Configuration.defaultConfiguration.fileURL!) 35 36 tableView.register(UINib(nibName: "TableViewCell", bundle: nil),forCellReuseIdentifier:"RecordCell") 37 38 } 39 40 @IBAction func buttonYesterday(_ sender: Any) { 41 labelToday.title = getYesterday() 42 } 43 44 @IBAction func buttonTomorrow(_ sender: Any) { 45 labelToday.title = getTomorrow() 46 } 47 48 49 @IBAction func wakeUpButton(_ sender: Any) { 50 51 let record = Record() 52 record.title = "起きる" 53 record.nowTime = getTime() 54 record.buttonImage = UIImage(named: "smile") 55 record.save() 56 57 //インスタンス取得 58 let realm = try! Realm() 59 60 try! realm.write { 61 realm.add(record) 62 } 63 self.tableView.reloadData() 64 65 } 66 67 @IBAction func sleepButton(_ sender: Any) { 68 69 let record = Record() 70 record.title = "寝る" 71 record.nowTime = getTime() 72 record.buttonImage = UIImage(named: "sleep") 73 record.save() 74 75 //インスタンス取得 76 let realm = try! Realm() 77 78 try! realm.write { 79 realm.add(record) 80 } 81 self.tableView.reloadData() 82 83 } 84 85 @IBAction func peepButton(_ sender: Any) { 86 87 let record = Record() 88 record.title = "うんち" 89 record.nowTime = getTime() 90 record.buttonImage = UIImage(named: "peep") 91 record.save() 92 93 //インスタンス取得 94 let realm = try! Realm() 95 96 try! realm.write { 97 realm.add(record) 98 } 99 self.tableView.reloadData() 100 101 } 102 103 @IBAction func urineButton(_ sender: Any) { 104 105 let record = Record() 106 record.title = "おしっこ" 107 record.nowTime = getTime() 108 record.buttonImage = UIImage(named: "diapers") 109 record.save() 110 111 //インスタンス取得 112 let realm = try! Realm() 113 114 try! realm.write { 115 realm.add(record) 116 } 117 self.tableView.reloadData() 118 119 } 120 121 @IBAction func milkButton(_ sender: Any) { 122 123 let record = Record() 124 record.title = "ミルク" 125 record.nowTime = getTime() 126 record.buttonImage = UIImage(named: "milk") 127 record.save() 128 129 //インスタンス取得 130 let realm = try! Realm() 131 132 try! realm.write { 133 realm.add(record) 134 } 135 self.tableView.reloadData() 136 137 } 138 139 @IBAction func feedButton(_ sender: Any) { 140 141 let record = Record() 142 record.title = "授乳" 143 record.nowTime = getTime() 144 record.buttonImage = UIImage(named: "breastfeed") 145 record.save() 146 147 //インスタンス取得 148 let realm = try! Realm() 149 150 try! realm.write { 151 realm.add(record) 152 } 153 self.tableView.reloadData() 154 155 } 156 157 158 159//画面が表示される前に実行される処理 160 override func viewWillAppear(_ animated: Bool) { 161 super.viewWillAppear(animated) 162 tableView.reloadData() 163 } 164 165 166//セル数宣言 167 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 168 169 let realm = try! Realm() 170 let records = realm.objects(Record.self) 171 return todoItems.count 172 } 173 174 175//セル表示 176 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 177 let cell = tableView.dequeueReusableCell(withIdentifier: "RecordCell", for: indexPath) as! TableViewCell 178 179 let realm = try! Realm() 180 let records = realm.objects(Record.self) 181 let object = todoItems[indexPath.row] 182 cell.bindData(text: object.title, label: object.nowTime, image: object.buttonImage!) 183 184// cell.setCell(record: records[indexPath.row]) 185 186 return cell 187 } 188 189 190 191 192 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 193 return true 194 } 195 196 197 198 199 func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) { 200 if editingStyle == .delete{ 201 let realm = try! Realm() 202 let records = realm.objects(Record.self) 203 let object = todoItems[indexPath.row] 204 205 try! realm.write{ 206 realm.delete(records) 207 } 208 209 tableView.deleteRows(at: [indexPath], with: .fade) 210 } 211 } 212 213 214 func deleteTodo(Index: Int){ 215 let realm = try! Realm() 216 try! realm.write{ 217 realm.delete(todoItems[Index]) 218 } 219 220 } 221 222 223//現時刻取得 224 func getToday() -> String{ 225 226 let f = DateFormatter() 227 f.dateStyle = .full 228 f.timeStyle = .none 229 f.locale = Locale(identifier: "ja_JP") 230 let now = Date() 231 return f.string(from: now) 232 } 233 234 func getTime() -> String{ 235 236 let f = DateFormatter() 237 f.dateStyle = .none 238 f.timeStyle = .short 239 f.locale = Locale(identifier: "ja_JP") 240 let now = Date() 241 return f.string(from: now) 242 } 243 244 func getYesterday() -> String{ 245 246 let f = DateFormatter() 247 f.dateStyle = .full 248 f.timeStyle = .none 249 f.locale = Locale(identifier: "ja_JP") 250 _ = Date() 251 let yesterday = Date(timeIntervalSinceNow: 60 * 60 * -24) 252 return f.string(from: yesterday) 253 } 254 255 func getTomorrow() -> String{ 256 257 let f = DateFormatter() 258 f.dateStyle = .full 259 f.timeStyle = .none 260 f.locale = Locale(identifier: "ja_JP") 261 _ = Date() 262 let tomorrow = Date(timeIntervalSinceNow: 60 * 60 * 24) 263 return f.string(from: tomorrow) 264 } 265 266 267} 268

試したこと

realm公式リファレンスや、キータの記事を参考に実装してみましたが意図した挙動になりません。

補足情報(FW/ツールのバージョンなど)```ここに言語を入力

コード

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

getYesterday()getTomorrow() で常に,今日を基準にした 1 日前, 1 日後の日付を取得しているのが原因です.

それぞれ,日付を動的に変更する必要があります.

Swift

1let yesterday = Date(timeIntervalSinceNow: 60 * 60 * -24)

Swift

1let tomorrow = Date(timeIntervalSinceNow: 60 * 60 * 24)

投稿2020/01/12 06:47

編集2020/01/12 06:49
s.m_1

総合スコア293

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

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

tom0708

2020/01/12 09:27

回答ありがとうございます! 原因は理解できたのですが、動的に日付を変更するとは、具体的にどのようにすればよいのでしょうか?
s.m_1

2020/01/12 09:51

今表示させている日付を変数 A に保存しておいて,A を基準に getYesterday() と getTommorow() 内で適切な日付を取得すればいいかと思います. なので,日付 A の前日の日付が欲しければ, let yesterday = Date(timeIntervalSinceNow: A * -24) ですし,翌日の日付が欲しければ, let tomorrow = Date(timeIntervalSinceNow: A * 24) になりますね. 日付が変わったら (前日,翌日のボタンが押されたら) A の値を変える必要があります.
tom0708

2020/01/12 10:07

ありがとうございます! 今日は実装できないので、明日解決できましたらベストアンサーとさせて頂きます!
tom0708

2020/01/14 03:35

変数Aに表示している日付を代入して、回答の通り代入しましたが、timeIntervalSinceNowの部分で、*はstring型には適用できないといったエラーがでました。 Aをintに変換すればよいのでしょうか。
s.m_1

2020/01/14 03:54

A に日付 (文字列) を代入した場合は,その日付からタイムスタンプに変換する必要がありますし,日付のタイムスタンプを A に代入している場合は,変換なしで使うことができます.
tom0708

2020/01/14 04:57

ちょっと混乱してきました???? 検索してますが、わかりやすいものが見つかりません。 今回の場合は、どちらの方法がコード数を少なく実装可能でしょうか。
s.m_1

2020/01/14 05:42

1. 変数 A に今日の日付の TimeInterval を保存 2-. [前日]が押された時に,-1 日分の TimeInterval を足して変数 A を更新 2+. [翌日]が押された時に,+1 日分の TimeInterval を足して変数 A を更新 3. 更新された A を引数にして新しい日付を取得 この流れで理解できますか?
tom0708

2020/01/14 06:52

ご丁寧にありがとうございます! 流れは理解できました! ただ、今の段階では知識不足で実装できそうにないので、調べながらやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問