我正在寻找一种创建单独文件的方法。例如:我有一个应用程序,其中包含名称,日期等形式,当我按保存时,我想将用户的该形式的所有信息保存到文件中。每次填写表单时,我都希望为每个用户创建一个新文件。该文件将保存在应用程序的文档目录中。该文件的名称应来自表单的“名称”文本字段。我已经研究了在swift中创建文件的方法,但文件名总是在路径url中进行硬编码,每次填写表单时,信息都会保存在同一个文件中。我不想这样做。感谢任何解决方案或建议,我似乎无法在线找到任何解决方案(只有如何创建具有硬编码文件名的文件,我已经能够做到)。
import UIKit
class FormViewController: UIViewController {
@IBOutlet weak var organdonationno: UITextField!
@IBOutlet weak var donorage: UITextField!
@IBOutlet weak var snodname: UITextField!
@IBOutlet weak var donorshospital: UITextField!
@IBOutlet weak var date: UITextField!
@IBOutlet weak var ID: UITextField!
var fileMgr: FileManager = FileManager.default
var docsDir: String?
var dataFile: String?
override func viewDidLoad() {
super.viewDidLoad()
let filemgr = FileManager.default
let dirPaths = filemgr.urls(for: .documentDirectory, in: .userDomainMask)
dataFile = dirPaths[0].appendingPathComponent("path").path
if filemgr.fileExists(atPath: dataFile!) {
let databuffer1 = filemgr.contents(atPath: dataFile!)
let databuffer2 = filemgr.contents(atPath: dataFile!)
let databuffer3 = filemgr.contents(atPath: dataFile!)
let databuffer4 = filemgr.contents(atPath: dataFile!)
let databuffer5 = filemgr.contents(atPath: dataFile!)
let datastring1 = NSString(data: databuffer1!, encoding: String.Encoding.utf8.rawValue)
let datastring2 = NSString(data: databuffer2!, encoding: String.Encoding.utf8.rawValue)
let datastring3 = NSString(data: databuffer3!, encoding: String.Encoding.utf8.rawValue)
let datastring4 = NSString(data: databuffer4!, encoding: String.Encoding.utf8.rawValue)
let datastring5 = NSString(data: databuffer5!, encoding: String.Encoding.utf8.rawValue)
organdonationno.text = datastring1 as? String
donorage.text = datastring2 as? String
snodname.text = datastring3 as? String
donorshospital.text = datastring4 as? String
date.text = datastring5 as? String
}
// Do any additional setup after loading the view.
}
@IBAction func savdata(_ sender: Any) {
let databuffer1 = (organdonationno.text)!.data(using: String.Encoding.utf8)
let databuffer2 = (donorage.text)!.data(using: String.Encoding.utf8)
let databuffer3 = (snodname.text)!.data(using: String.Encoding.utf8)
let databuffer4 = (donorshospital.text)!.data(using: String.Encoding.utf8)
let databuffer5 = (date.text)!.data(using: String.Encoding.utf8)
fileMgr.createFile(atPath: dataFile!, contents: databuffer1, attributes: nil)
fileMgr.createFile(atPath: dataFile!, contents: databuffer2, attributes: nil)
fileMgr.createFile(atPath: dataFile!, contents: databuffer3, attributes: nil)
fileMgr.createFile(atPath: dataFile!, contents: databuffer4, attributes: nil)
fileMgr.createFile(atPath: dataFile!, contents: databuffer5, attributes: nil)
}
}
答案 0 :(得分:1)
它只保存日期,因为您使用相同的名称为每个字段创建文件。它每次都被新文件覆盖。上次创建的文件是日期,因此只有日期持续存在。如果要保存一个用户的所有表单数据,可以按照以下方式执行。您需要为每个表单创建动态文件名,以便覆盖它。
@IBAction func savdata(_ sender: Any) {
let fileName="\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) "
let file = "\(fileName).txt" //this is the file. we will write to and read from it
let text = fileName //just a text
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let path = dir.appendingPathComponent(file)
//writing
do {
try text.write(to: path, atomically: false, encoding: String.Encoding.utf8)
}
catch {/* error handling here */}
//reading
do {
let text2 = try String(contentsOf: path, encoding: String.Encoding.utf8)
}
catch {/* error handling here */}
}
------ -------- EDIT
要移除Optional
单词,需要通过在需要打开的对象后放置感叹号(!)来强行打开该值。
var canBeNil : String? = "shubhra"
print(canBeNil) // output Optional("shubhra")
print(canBeNil!) // output shubhra
如果您需要标题为organdonationno只需编辑:
let fileName="\(organdonationno.text)"
let text = "\(organdonationno.text) + \(donorage.text) + \(snodname.text) + \(donorshospital.text) + (date.text) "
只需确保您的文件名是唯一的,这样就不会被覆盖。
希望它有所帮助。快乐编码!!
答案 1 :(得分:1)
我的解决方案似乎与上面类似。您最好使用用户从文本字段输入的信息来组织文件的唯一名称。我强烈建议您编写一个模型来存储您的属性,并为了清除编码而执行保存到磁盘的工作。我可以举一个我刚刚在操场上写的例子:
struct User {
let organdonationno: NSString
let donorage: NSString
let snodName: NSString
let donorshospital: NSString
let date: NSString
let ID: NSString
func saveToJSONFile() {
guard let documentDirectoryUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let pathComponent = ID.appending(".json")
let array = NSArray(array: [organdonationno, donorage, snodName, donorshospital, date, ID])
let fileURL = documentDirectoryUrl.appendingPathComponent(pathComponent)
do {
let data = try JSONSerialization.data(withJSONObject: array, options: [])
try data.write(to: fileURL, options: .atomic)
}
catch {
print(error)
}
}
}
我正在编写的代码将struct的属性放入NSArray
,它可以很容易地序列化为JSON对象。 JSON是一种显示良好的数据结构。当它写入您的磁盘文件时,您可以打开.json文件以查看内部。它就像[ string1, string2, string3, string4, string5, string6]
一样,很容易理解
你可以这样使用它:
let user = User(organdonationno: datastring1, donorage: datastring2, snodName: datastring3, donorshospital: datastring4, date: datastring5, ID: datastring6)
user.saveToJSONFile()
如果您使用的是swift 4,则可以方便地将User
结构转换为JSON对象。您只需要让User
符合Codable
,而苹果的底层实现将完成所有工作。
Struct User: Codable {