0

我正在尝试在 tableViewCell 的核心数据中共享我保存的事件,但是每当我按下共享时,它都会显示 activityViewController 但不会给我任何共享它的选项。我也尝试在我的 iPhone 上运行它,并且出现了同样的问题。

class EventsTableViewController: UITableViewController {

@IBOutlet var table: UITableView!

var  eventsArray: [NSManagedObject] = []

// The Managed Object Context retrieved from the app delegate

let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext



override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    //self.navigationItem.rightBarButtonItem = self.editButtonItem
}

override func viewWillAppear(_ animated: Bool) {
    gettAllRecords()
}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return eventsArray.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomTableViewCell

    let event = eventsArray[indexPath.row]

    let eventTitle = event.value(forKeyPath: "eTitle") as? String
    let eventLocation = event.value(forKeyPath: "eLocation") as? String
    let eventDateTime = event.value(forKeyPath: "eDateTime") as? String

    cell.titleLable.text = eventTitle
    cell.locationLable.text = eventLocation
    cell.dateTimeLable.text = eventDateTime

    return cell
}


/***********************************************************************
 *
 * This function gets all records from the database and returns
 * an array of ManagedObject
 *
 **********************************************************************/

func gettAllRecords() {

    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Event")

    do {
        eventsArray = try managedContext.fetch(fetchRequest)

        table.reloadData()

    } catch let error as NSError {

        print("Could not fetch. \(error), \(error.userInfo)")

    }
}


// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

}

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    let shareActions = UITableViewRowAction(style: .normal, title: "Share") { (_ rowAction: UITableViewRowAction, _ indexPath: IndexPath) in

        let shareEvent = self.eventsArray[indexPath.row] //I feel like shareEvent is not being populated with self.eventsArray

        let activityViewController = UIActivityViewController(activityItems: [shareEvent], applicationActivities: nil)

        self.present(activityViewController, animated: true, completion: nil)

    }

    let deleteAction = UITableViewRowAction(style: .default, title: "Delete") { (_ rowAction: UITableViewRowAction, _ indexPath: IndexPath) in
        let event = self.eventsArray[indexPath.row]
        self.managedContext.delete(event)

        (UIApplication.shared.delegate as! AppDelegate).saveContext()

        self.gettAllRecords()
    }

    shareActions.backgroundColor = UIColor.gray

    return [deleteAction, shareActions]

}

这是我尝试保存时显示的内容

知道这里发生了什么吗?我也尝试在我的 iPhone 上运行它,并且出现了同样的问题。

4

3 回答 3

0

我不确定您的 ShareEvent 是什么样的,但您需要以其他应用程序支持的格式共享数据。将您的数据放入文件中或将其转换为已知的数据类型。

在此处查找一些已知的系统类型。

https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259

于 2017-04-27T17:08:14.023 回答
0

我同意您自己的评估,即 shareEvents 可能为零。您是否在分配断点的行上添加了断点?在 Xcode 中,停在以下行:

let shareEvent = self.eventsArray[indexPath.row] //I feel like shareEvent is not being populated with self.eventsArray

并确保 shareEvents 不为零。

于 2017-04-27T16:09:32.723 回答
0

您要共享的项目只是您的NSManagedObject实例。没有一个共享服务知道如何处理它,所以它们都没有出现。

您可以将项目共享为图像、文本或各种标准文件类型。您需要做的是实现将您的数​​据NSManagedObject转换为某种标准格式的东西。

创建一个采用该UIActivityItemSource协议的类。该类将获取您的数据,将其转换为某种标准格式以共享(文本、图像或适合您的应用程序的任何内容)并返回。然后,不是将原始对象传递给UIActivityViewController,而是传递UIActivityItemSource对象。

例如,假设您的项目应该作为文本共享。您将实现一个采用该UIActivityItemSource协议的类,它将包含一个函数,该函数获取您的数据并创建一个格式良好的字符串。

class MyItemSource: UIActivityItemSource {

    func activityViewController(_ activityViewController: UIActivityViewController,
                            itemForActivityType activityType: UIActivityType) -> Any? {

        // Take your data and create a string
        var stringToShare = "Hello world!"
        ...
        return stringToShare
    }

    // other UIActivityItemSource methods
}

如果您将 MyItemSource 的实例传递给 UIActivityViewController,共享服务将收到一个字符串,上面写着“Hello world!”。

于 2017-04-28T02:07:32.203 回答