Swift新手求助:点击按钮后将服药时间写入文件的实现方法
Hey there! 作为Swift新手,把服药日志存到文件里其实没你想的那么复杂,我一步步给你拆解实现过程,保证你能看懂👇
实现服药日志写入文件的完整步骤
1. 先定义日志的数据结构
我们需要一个能序列化的结构体来存每次服药的时间,用Codable协议可以轻松把数据转成JSON写入文件:
struct MedicationLog: Codable { let timestamp: Date // 以后要是想加药品名称、剂量这类字段,直接在这里添加就行,扩展性很强 }
2. 获取日志文件的存储路径
iOS应用里,我们一般把用户数据存在Documents目录下,写个小方法来获取这个文件的URL:
private func getLogFilePath() -> URL? { // 先拿到Documents目录的路径 guard let documentsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { print("无法访问Documents目录") return nil } // 拼接日志文件名,这里用json格式方便读写 return documentsDir.appendingPathComponent("medicationLogs.json") }
3. 读取已有的日志(关键:要追加,不是覆盖)
每次点击按钮时,我们需要先把之前存的所有日志读出来,再把新的日志加进去,这样才不会丢失历史记录:
private func loadExistingLogs() -> [MedicationLog] { guard let filePath = getLogFilePath(), FileManager.default.fileExists(atPath: filePath.path) else { return [] // 如果文件还不存在,返回空数组就行 } do { // 读取文件里的Data let data = try Data(contentsOf: filePath) // 把Data转成日志数组 let logs = try JSONDecoder().decode([MedicationLog].self, from: data) return logs } catch { print("读取历史日志失败:\(error.localizedDescription)") return [] } }
4. 写入新的服药日志
把新的日志添加到历史数组里,再整体编码成JSON写入文件:
private func saveNewMedicationLog() { // 先读已有日志 var existingLogs = loadExistingLogs() // 创建新的日志条目(当前时间) let newLog = MedicationLog(timestamp: Date()) existingLogs.append(newLog) do { let encoder = JSONEncoder() // 用标准的ISO8601格式存日期,以后读取时能准确转成Date对象 encoder.dateEncodingStrategy = .iso8601 // 把日志数组编码成Data let data = try encoder.encode(existingLogs) guard let filePath = getLogFilePath() else { return } // 写入文件 try data.write(to: filePath) print("服药日志已成功记录!") // 这里可以加个用户提示,比如弹出Alert或者Toast } catch { print("保存日志失败:\(error.localizedDescription)") } }
5. 给“服药”按钮绑定点击事件
最后一步,在你的ViewController里找到按钮的点击方法,调用我们写的保存函数就行:
@IBAction func takeMedicationButtonTapped(_ sender: UIButton) { saveNewMedicationLog() // 可选:给用户反馈,比如弹出提示框 let alert = UIAlertController(title: "记录成功", message: "已保存本次服药时间", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) present(alert, animated: true) }
小提示
- 日期格式:用
iso8601编码的日期是标准化的字符串,比如"2024-05-20T14:23:12Z",以后不管是读取还是导出都很方便 - 错误处理:上面的代码里用了
print来输出错误,实际开发中可以换成给用户的友好提示,比如弹窗告诉用户保存失败 - 文件格式:用JSON是因为它易读易解析,要是以后需要更高效的存储,也可以换成PropertyList或者二进制格式
内容的提问来源于stack exchange,提问作者John Martin
相关产品推荐
相关产品推荐

