使用 canEditRowAtIndexPath 从解析中删除图像

Posted

技术标签:

【中文标题】使用 canEditRowAtIndexPath 从解析中删除图像【英文标题】:Deleting images from parse using canEditRowAtIndexPath 【发布时间】:2015-07-01 08:16:00 【问题描述】:

我目前正在使用 swift(parse) 编写一个类似于 instagram 的小项目。用户发布图像后,它被上传以解析,我将其检索到 tableview 中。由于图像需要转换为 NSData 和 PFFile,因此将其保存为 PFFile。我试图使用canEditRowAtIndexPath by objectToDelete.deleteInBackgroundWithBlock 从表视图的解析中删除文件。但是从我的研究中我发现 PFFile 不能从用户中删除,只能删除对象。但是图像文件对于对象来说太大了。 (我希望我是对的)。我想知道在用户不想看到它或删除帖子后如何使它不显示在表格视图中。

更新

 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool 
        return true
    
    func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) 
        println("Commit Editing Style \(editingStyle)")
    

func tableView(tableView: UITableView!, editActionsForRowAtIndexPath indexPath: NSIndexPath!) -> [AnyObject]! 



    var deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler: 
        (action: UITableViewRowAction!, indexPath: NSIndexPath!) in
        println("Triggered delete action \(action) atIndexPath: \(indexPath)")
        return
    )

    return [deleteAction]



    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
        if editingStyle == .Delete 


            var fileName = "uploaded_image.png"
            let applicationID = "appidwritten"
            let masterKey = "masterkeywritten"

            let request = NSMutableURLRequest(URL: NSURL(string: "https://api.parse.com/1/files/\(fileName)")!)
            request.HTTPMethod = "DELETE"
            request.setValue(applicationID, forHTTPHeaderField: "X-Parse-Application-Id")
            request.setValue(masterKey, forHTTPHeaderField: "X-Parse-Master-Key")
            NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler:  (data, response, error) -> Void in
    println(response)
            ).resume()





谢谢

【问题讨论】:

【参考方案1】:

deleteInBackgroundWithBlock不能删除文件:

为什么我不能使用 SDK 删除文件?

由于文件没有 ACL,因此无法将其写入权限限制为特定用户。由于任由任意用户删除文件并不是一个很好的安全措施,因此我们要求使用主密钥来删除文件。由于客户端 SDK 无法使用主密钥,因此您需要使用 REST API。

https://parse.com/questions/how-can-i-delete-a-file

所以你应该像这样通过 REST API 删除一个文件:

var fileName = ""
let applicationID = ""
let masterKey = ""

let request = NSMutableURLRequest(URL: NSURL(string: "https://api.parse.com/1/files/\(fileName)")!)
request.HTTPMethod = "DELETE"
request.setValue(applicationID, forHTTPHeaderField: "X-Parse-Application-Id")
request.setValue(masterKey, forHTTPHeaderField: "X-Parse-Master-Key")
NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler:  (data, response, error) -> Void in
    println(response)
).resume()

文件名必须是上传操作响应中的名称,而不是原始文件名。

【讨论】:

感谢您的回答!我从来不知道你可以在 REST API 中使用 swift。这是否意味着我可以将上面的代码放在func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) if editingStyle == .Delete 中,因为我没有看到任何事情发生。我已经正确填写了文件名和应用程序ID和主密钥。 我认为将这段代码放在帮助器类中是一种更好的方法,然后您几乎可以从项目中的任何位置调用帮助器类。 不,我什至不能滑动删除。我已经更新了我的代码。

以上是关于使用 canEditRowAtIndexPath 从解析中删除图像的主要内容,如果未能解决你的问题,请参考以下文章

Swift canEditRowAtIndexPath 在 UIPageViewController EZSwipeViewController 中不起作用

UICollectionView - UICollectionViewDelegate - 如何实现与 canEditRowAtIndexPath 等效?

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) 几乎符合可选要求

使用滑动手势在 swift3 中编辑表格视图单元格

UITableViewCell 删除按钮没有出现

测试使用