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

标签 ios swift uitableview csv

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

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

我知道这个问题已经被问过一百万次了,我已经尝试了很多次,但我不知道如何将我的 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
}
}    

最佳答案

Try The Below Code It may help for generate csv string file

func configuredMailComposeViewController() -> MFMailComposeViewController {
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setSubject("My app Data")
        mailComposerVC.setMessageBody("my app doc csv", isHTML: false)
        let csvStringData = generateStringForCSV()
        let data = csvStringData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        mailComposerVC.addAttachmentData(data!, mimeType: "text/csv", fileName: fileName)
        return mailComposerVC
    }

func generateStringForCSV (currentSessionData:[String:String]) -> NSMutableString {
    let delimiter = ","
    let stringData:NSMutableString  = NSMutableString()
    let currentSessionData = sensorHeader + sensorsData

    for data in currentSessionData {
        stringData.appendString(data.0)
        stringData.appendString(delimiter)
        stringData.appendString(data.1)
        stringData.appendString("\n")
    }
    return stringData
}

关于ios - Swift 从 UITableView 创建 CSV 并附加到电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37247639/

相关文章:

objective-c - 将 NSString TO NSNumber 准确转换为十进制

ios - 如何在 Swift 中使用带有 #define 宏的 Objective-C 代码

json - Swift 从循环内部追加到数组

swift - 学习 swift : expressions are not allowed at the top level

ios - 如何使 UIImage 宽度等于自定义单元格内 View 的宽度和比例高度

ios - 自动布局 : Align two button side by side and move to right side when there is no image

ios - 将两个 UIImageView 组合成一个图像拉伸(stretch)

iphone - 是否可以将图像叠加在整个 iOS 应用程序上?

ios - 在滚动具有多个部分的 UITableViewController 时修复 tableHeaderView

ios - dequeueReusableCell 重叠按钮/使用具有自定义类的协议(protocol)