Ios Swift从UITableView创建CSV并附加到电子邮件

Ios Swift从UITableView创建CSV并附加到电子邮件,ios,swift,uitableview,csv,Ios,Swift,Uitableview,Csv,我刚开始使用Swift(以及一般的编程),并试图为我工作的公司创建一个简单的订单列表电子邮件应用程序 我的应用程序的基础来自Envato Tuts+Swift购物清单教程 我知道这个问题已经被问过无数次了,我已经尝试了很多次,但是对于如何将我的UITableView列表数据获取到CSV文件并附加它,我不知所措 下面是我的ShoppingListViewController.swift文件内容,我在其中加入了一个按钮来启动MFMailComposeViewControllerDelegate 有人

我刚开始使用Swift(以及一般的编程),并试图为我工作的公司创建一个简单的订单列表电子邮件应用程序

我的应用程序的基础来自Envato Tuts+Swift购物清单教程

我知道这个问题已经被问过无数次了,我已经尝试了很多次,但是对于如何将我的
UITableView
列表数据获取到CSV文件并附加它,我不知所措

下面是我的ShoppingListViewController.swift文件内容,我在其中加入了一个按钮来启动
MFMailComposeViewControllerDelegate

有人能把我带到正确的轨道上吗

import UIKit
import MessageUI
import Foundation

class ShoppingListViewController: UITableViewController, MFMailComposeViewControllerDelegate{


var convertMutable: NSMutableString!

func showSendMailErrorAlert()
{
    let sendMailErrorAlert = UIAlertController(title: "Could Not Send Email", message: "Your device could not send e-mail.  Please check e-mail configuration and try again.", preferredStyle: .Alert)
    self.presentViewController(sendMailErrorAlert, animated: true, completion: nil)
}
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?)
{
    controller.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func sendMailButtonTapped(sender: AnyObject){
    print("Email Tapped")

    convertMutable = NSMutableString();
    for item in shoppingList
    {
        convertMutable.appendFormat("%@\r", item.name, item.quantity)
    }
    print("NSMutableString: \(convertMutable)")

    let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    if let d = data {
        print("NSData: \(d)")
    }
    func configuredMailComposeViewController() -> MFMailComposeViewController{
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setToRecipients(["mh@derivan.com.au"])
        mailComposerVC.setSubject("From the Orders App")
        mailComposerVC.setMessageBody(String (items), isHTML: false)
        mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: "Order.csv")
        return mailComposerVC
    }
    let mailComposeViewController = configuredMailComposeViewController()
    if MFMailComposeViewController.canSendMail()
    {
        self.presentViewController(mailComposeViewController, animated: true, completion: nil)
    }
    else
    {
        self.showSendMailErrorAlert()
    }
}


let CellIdentifier = "Cell Identifier"
var items = [Item]() {
    didSet {
        buildShoppingList()
    }
}
var shoppingList = [Item]() {
    didSet {
        tableView.reloadData()
        //print (items)
    }
}
override func viewDidLoad() {
    super.viewDidLoad()
    title = "Order List"
    loadItems()
    tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: CellIdentifier)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ShoppingListViewController.updateShoppingList(_:)), name: "ShoppingListDidChangeNotification", object: nil)
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return shoppingList.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier, forIndexPath: indexPath)
    let item = shoppingList[indexPath.row]
    cell.textLabel?.text = item.name
    cell.detailTextLabel?.text = String(format: "%.0f", item.quantity)
    print (item.name, item.quantity)
    return cell

}
func updateShoppingList(notification: NSNotification) {
    loadItems()
}
func buildShoppingList() {
    shoppingList = items.filter({ (item) -> Bool in
        return item.inShoppingList
    })
}
private func loadItems() {
    if let filePath = pathForItems() where NSFileManager.defaultManager().fileExistsAtPath(filePath) {
        if let archivedItems = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [Item] {
            items = archivedItems
        }
    }
}
private func pathForItems() -> String? {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    if let documents = paths.first, let documentsURL = NSURL(string: documents) {
        return documentsURL.URLByAppendingPathComponent("items").path
    }
    return nil
}
}    
尝试下面的代码,它可能有助于生成csv字符串文件


感谢您深思熟虑的回答,我在stackoverflow的帮助下解决了一些问题,现在使用以下代码成功地从UITableView附加了一个包含my item.name对象的CSV

@IBAction func sendMailButtonTapped(sender: AnyObject){
    print("Email Tapped")

    convertMutable = NSMutableString();
    for item in shoppingList
    {
        convertMutable.appendFormat("%@\r", item.name, item.quantity)
    }
    print("NSMutableString: \(convertMutable)")

    let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    if let d = data {
        print("NSData: \(d)")
    }
    func configuredMailComposeViewController() -> MFMailComposeViewController{
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setToRecipients(["mh@derivan.com.au"])
        mailComposerVC.setSubject("From the Orders App")
        mailComposerVC.setMessageBody(String (items), isHTML: false)
        mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: "Order.csv")
        return mailComposerVC
    }
我是如此接近这是可笑的,但我不能处理一个没有订单数量收到的订单。 我现在遇到的问题是,如何将item.quantity对象与其item.name对象一起放入csv

当我打印(item.name、item.quantity)时,我将它们放在输出中,但在转换为NSData时将它们加在一起,我只在csv中获得item.name。
我还更新了我的第一篇文章中的代码,直到现在为止。

你为什么评论了
//mailComposerVC.addAttachmentData
?你已经发布了一堆代码,但没有解释问题所在。请更新您的问题,并用代码解释您的实际问题。请说得具体一点。@Shubhank,那是之前测试的遗留问题,效果不太好……如果你在这一部分要求帮助,这将是一个更好的问题,而不是简单地问如何创建csv。实际上,我真正需要的是,按下按钮后,shoppinglist uitableview的文本内容将显示在电子邮件的邮件正文中。当我“打印(项目)”时,输出中会出现十六进制值,例如[,],而不是文本值。转换为csv和附加将是一个巨大的奖金,但实际上并不是必要的。
@IBAction func sendMailButtonTapped(sender: AnyObject){
    print("Email Tapped")

    convertMutable = NSMutableString();
    for item in shoppingList
    {
        convertMutable.appendFormat("%@\r", item.name, item.quantity)
    }
    print("NSMutableString: \(convertMutable)")

    let data = convertMutable.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    if let d = data {
        print("NSData: \(d)")
    }
    func configuredMailComposeViewController() -> MFMailComposeViewController{
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setToRecipients(["mh@derivan.com.au"])
        mailComposerVC.setSubject("From the Orders App")
        mailComposerVC.setMessageBody(String (items), isHTML: false)
        mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: "Order.csv")
        return mailComposerVC
    }