Swift: 要求用户在点击每个停止按钮后输入文本文件名
Swift: Ask user to input the text file name after each stop button is clicked
我创建了一个可以采集数据的停止按钮,点击停止按钮后会保存到定义的路径中。但是,如果我想在点击停止按钮后继续采集,数据会添加到原始文本文件中。 (这是有道理的,因为我只知道如何定义一条路径)
我的问题是:是否可以要求用户在每次停止后输入一个新的文件名并另存为一个新的文本文件,这样数据就不会添加到原始文件中?
下面是我对一个定义的路径和堆叠数据的了解:
@IBAction func stopbuttonTapped(_ btn: UIButton) {
do {
let username:String = user_name.text!
fpsTimer.invalidate() //turn off the timer
let capdata = captureData.map{[=11=].verticesFormatted}.joined(separator:"") //convert capture data to string
let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! as URL
let url = dir.appendingPathComponent("testing.txt") //name the file
try capdata.appendLineToURL(fileURL: url as URL)
let result = try String(contentsOf: url as URL, encoding: String.Encoding.utf8)
}
catch {
print("Could not write to file")
}
}
以及我用于字符串和数据的扩展名:
extension String {
func appendLineToURL(fileURL: URL) throws {
try (self).appendToURL(fileURL: fileURL)
}
func appendToURL(fileURL: URL) throws {
let data = self.data(using: String.Encoding.utf8)!
try data.append(fileURL: fileURL)
}
func trim() -> String
{
return self.trimmingCharacters(in: CharacterSet.whitespaces)
}
}
extension Data {
func append(fileURL: URL) throws {
if let fileHandle = FileHandle(forWritingAtPath: fileURL.path) {
defer {
fileHandle.closeFile()
}
fileHandle.seekToEndOfFile()
fileHandle.write(self)
}
else {
try write(to: fileURL, options: .atomic)
}
}
}
我是否需要设置默认文件名(可能 texting.txt)然后弹出用户输入以保存文本文件? (这就是我不太确定如何集成到我已有的东西的地方)。非常感谢您抽出时间提前提出建议。
您可以生成唯一的名称。
例如:
let url = dir.appendingPathComponent("testing-\(Date.timeIntervalSinceReferenceDate).txt")
或
let url = dir.appendingPathComponent("testing-\(UUID().uuidString).txt")
我创建了一个可以采集数据的停止按钮,点击停止按钮后会保存到定义的路径中。但是,如果我想在点击停止按钮后继续采集,数据会添加到原始文本文件中。 (这是有道理的,因为我只知道如何定义一条路径)
我的问题是:是否可以要求用户在每次停止后输入一个新的文件名并另存为一个新的文本文件,这样数据就不会添加到原始文件中?
下面是我对一个定义的路径和堆叠数据的了解:
@IBAction func stopbuttonTapped(_ btn: UIButton) {
do {
let username:String = user_name.text!
fpsTimer.invalidate() //turn off the timer
let capdata = captureData.map{[=11=].verticesFormatted}.joined(separator:"") //convert capture data to string
let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! as URL
let url = dir.appendingPathComponent("testing.txt") //name the file
try capdata.appendLineToURL(fileURL: url as URL)
let result = try String(contentsOf: url as URL, encoding: String.Encoding.utf8)
}
catch {
print("Could not write to file")
}
}
以及我用于字符串和数据的扩展名:
extension String {
func appendLineToURL(fileURL: URL) throws {
try (self).appendToURL(fileURL: fileURL)
}
func appendToURL(fileURL: URL) throws {
let data = self.data(using: String.Encoding.utf8)!
try data.append(fileURL: fileURL)
}
func trim() -> String
{
return self.trimmingCharacters(in: CharacterSet.whitespaces)
}
}
extension Data {
func append(fileURL: URL) throws {
if let fileHandle = FileHandle(forWritingAtPath: fileURL.path) {
defer {
fileHandle.closeFile()
}
fileHandle.seekToEndOfFile()
fileHandle.write(self)
}
else {
try write(to: fileURL, options: .atomic)
}
}
}
我是否需要设置默认文件名(可能 texting.txt)然后弹出用户输入以保存文本文件? (这就是我不太确定如何集成到我已有的东西的地方)。非常感谢您抽出时间提前提出建议。
您可以生成唯一的名称。
例如:
let url = dir.appendingPathComponent("testing-\(Date.timeIntervalSinceReferenceDate).txt")
或
let url = dir.appendingPathComponent("testing-\(UUID().uuidString).txt")