我制作了一款应用UITableView
,其中todoItems
为array
。它运行完美,我有一个导出按钮,可以从UITableView
数据创建一个CSV文件并通过电子邮件发送出来:
// Variables
var toDoItems:[String] = []
var convertMutable: NSMutableString!
var incomingString: String = ""
var datastring: NSString!
// Mail alert if user does not have email setup on device
func showSendMailErrorAlert() {
let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send e-mail. Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "OK")
sendMailErrorAlert.show()
}
// MARK: MFMailComposeViewControllerDelegate Method
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
controller.dismissViewControllerAnimated(true, completion: nil)
}
// CSV Export Button
@IBAction func csvExport(sender: AnyObject) {
// Convert tableView String Data to NSMutableString
convertMutable = NSMutableString();
for item in toDoItems
{
convertMutable.appendFormat("%@\r", item)
}
print("NSMutableString: \(convertMutable)")
// Convert above NSMutableString to NSData
let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
if let d = data { // Unwrap since data is optional and print
print("NSData: \(d)")
}
//Email Functions
func configuredMailComposeViewController() -> MFMailComposeViewController {
let mailComposerVC = MFMailComposeViewController()
mailComposerVC.mailComposeDelegate = self
mailComposerVC.setSubject("CSV File Export")
mailComposerVC.setMessageBody("", isHTML: false)
mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: "TodoList.csv")
return mailComposerVC
}
// Compose Email
let mailComposeViewController = configuredMailComposeViewController()
if MFMailComposeViewController.canSendMail() {
self.presentViewController(mailComposeViewController, animated: true, completion: nil)
} else {
self.showSendMailErrorAlert() // One of the MAIL functions
}
}
我的问题是如何创建相同的CSV文件,而不是通过电子邮件发送,将其保存到文件?我是编程新手并且仍在学习Swift 2.我理解代码(data!, mimeType: "text/csv", fileName: "TodoList.csv")
部分将文件创建为附件。我在网上看了这个,试图理解路径和目录对我来说很难。我的最终目标是让另一个UITableView
列出这些“已保存”的CSV文件。有人可以帮忙吗?谢谢!
我在项目中添加了以下IBAction
:
// Save Item to Memory
@IBAction func saveButton(sender: UIBarButtonItem) {
// Convert tableView String Data to NSMutableString
convertMutable = NSMutableString();
for item in toDoItems
{
convertMutable.appendFormat("%@\r", item)
}
print("NSMutableString: \(convertMutable)")
// Convert above NSMutableString to NSData
let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
if let d = data { // Unwrap since data is optional and print
print("NSData: \(d)")
}
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
func writeToFile(_: convertMutable, path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws {
}
}
答案 0 :(得分:1)
多年来,我一直在努力寻找一个像样的简单答案。
这是我发现创建csv文件甚至是您想要的目录并将其写入的最佳方法。
//First make sure you know your file path, you can get it from user input or whatever
//Keep the path clean of the name for now
var filePath = "/Users/Johnson/Documents/NEW FOLDER/"
//then you need to pick your file name
let fileName = "AwesomeFile.csv"
//You should probably have some data to put in it
//You can even convert your array to a string by appending all of it's elements
let fileData = "This,is,just,some,dummy,data"
// Create a FileManager instance this will help you make a new folder if you don't have it already
let fileManager = FileManager.default
//Create your target directory
do {
try fileManager.createDirectory(atPath: filePath!, withIntermediateDirectories: true, attributes: nil)
//Now it's finally time to complete the path
filePath! += fileName!
}
catch let error as NSError {
print("Ooops! Something went wrong: \(error)")
}
//Then simply write to the file
do {
// Write contents to file
try fileData.write(toFile: filePath!, atomically: true, encoding: String.Encoding.utf8)
print("Writing CSV to: \(filePath!)")
}
catch let error as NSError {
print("Ooops! Something went wrong: \(error)")
}
PS。刚刚注意到这个问题是从一年前开始的,但是我希望当他们像我一样无意中发现这个问题时,它能帮助像我这样挣扎的新手。
答案 1 :(得分:0)
convertMutable
可以使用fun writeToFile(_ path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws
或func writeToURL(_ url: NSURL, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws
轻松写入磁盘。您所要做的就是创建一个路径或URL来写出字符串。如果您使用的是iCloud,那么事情会更具挑战性,但对于本地存储的文件,您可以使用let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
来获取文档目录的根路径。
更新:根据您在下面的第一条评论,这里有一些补充信息: 第一个问题是,看起来好像您正在寻找代码,您只需粘贴到您的项目中,而无需真正理解它的作用。如果我错了,我的抱怨,但如果我说对了,这不是一条好路线,因为当事情发生变化时,你会遇到很多问题。
在上一个代码部分的底部,您尝试在函数内创建一个函数,该函数不会执行您想要的操作。上面提到的函数是两个NSString函数的声明,而不是您需要创建的函数。由于NSMutableString是NSString的子类,因此您可以在convertMutable
变量上使用这些函数。
您需要处理的另一件事是为要保存的文件创建一个名称,目前您已粘贴到上面的行中,该行获取了Documents目录但没有文件名。每次保存CSV文件并将该名称添加到path
的末尾时,您需要设计一种创建唯一文件名的方法。然后,您可以使用writeToFile…
或writeToURL…
将字符串写入所需位置。
如果您发现自己并未完全理解要添加的代码,请考虑获取一本书或查找有关Swift的课程(Coursera.org有一个可能有用的课程)。有很多资源可以学习软件开发和Swift的基础知识,需要花费精力和时间,但如果这是你想要追求的东西,那么它最终是值得的。