【问题标题】:PFQueryTableViewController Remove Cell Animated (Parse.com)PFQueryTableViewController 删除单元格动画(Parse.com)
【发布时间】:2015-03-17 11:37:36
【问题描述】:

我正在使用 Parse 和 PFQueryTableViewController 来显示来自 Parse 的帖子列表,这可以很好地显示它们。我希望允许用户向左滑动单元格并删除单元格,这会将其从 Parse 中删除并从 UI 中淡出。

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {

    return true
}

这启用了漂亮的 iOS8 编辑风格。这就是问题开始的地方。当我点击删除按钮时,我可以看到我的消息正在控制台中记录:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {

    var deleteRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler:{action, indexpath in
        println("DELETE•ACTION");
    });

    return [deleteRowAction];
}

但是,以下内容永远不会被调用:

override  func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == UITableViewCellEditingStyle.Delete {
        var object = self.objectAtIndexPath(indexPath)
        println("good start")
        // The following lines means the project can't build because self.objects is of type NSArray not NSMutableArray
        self.objects.removeAtIndex(indexpath)
        object.deleteInBackgroundWithBlock({ (Bool, NSError) -> Void in
            self.loadObjects()
            println("its alive...sort of")
        })
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}

所以问题确实是双重的。

问题 1

当我按下删除按钮时,我的 commitEditingStyle 似乎没有被调用?我的愚蠢日志消息没有被打印到控制台

问题 2

我无法删除 indexpath 中的对象,因为在 PFQueryTableViewController 中,self.objects 是一个 NSArray。我不知道如何解决这个问题?我读过一些关于覆盖 objectsDidLoad 方法并从 self.objects 创建 NSMutableArray 或创建子类的内容,但没有详细信息,我不明白如何将表的数据源从 self.objects 更改为 self。以 myNewMutableArray 为例

我已经看到了一些类似的答案,但到目前为止还没有明确的答案。我不介意答案是否在obj C中,我只需要了解我需要做什么的原则。

更新

根据 Rory McKinnel 的回答,问题一已解决。

对于问题 2,我创建了以下子类:

class EditablePFQueryTableViewController: PFQueryTableViewController{

var editableObjects: NSMutableArray = NSMutableArray()

override func objectsDidLoad(error: NSError!) {
    super.objectsDidLoad(NSError())
    editableObjects = NSMutableArray(array: self.objects)

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func objectAtIndexPath(indexPath: NSIndexPath!) -> PFObject! {
    var object = self.editableObjects.objectAtIndex(indexPath.row) as PFObject
    return object
}

// overriding this to try and make sure the number of rows is accurate
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    var numberOfRows = self.editableObjects.count
    return numberOfRows
}

}

并补充:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {

    var deleteRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler:{action, indexpath in
        println("DELETE•ACTION");
        var object = self.objectAtIndexPath(indexPath)
        self.editableObjects.removeObjectAtIndex(indexPath.row)
        object.deleteInBackgroundWithBlock({ (Bool, NSError) -> Void in
            self.loadObjects()
            println("its alive")
        })
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

    });

    return [deleteRowAction];
}

这似乎工作正常

【问题讨论】:

  • 问题2,如this answer所示,在self.loadObjects()后面加self.tableView.reloadData()即可。

标签: ios objective-c uitableview swift parse-platform


【解决方案1】:

editActionsForRowAtIndexPath 允许您返回要执行的操作,选择后将触发您注册的处理程序,仅此而已。您必须将所有删除代码放在处理程序中。您可以从您注册的处理程序中自己调用commitEditingStyle。这就是为什么您只看到 NSLog 消息而没有其他内容的原因。

如果您希望它为您调用commitEditingStyle,那么您需要实现以下方法,从该方法中返回您想要的 indexPath 传递的编辑样式。然后它会在用户激活时调用commitEditingStyle

  optional func tableView(_ tableView: UITableView,
  editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle

所以你必须使用其中一个。

【讨论】:

  • 知道了。感谢您的回答,也很好的解释!关于 Parse 的任何线索(问题 2)?
  • 您可以尝试覆盖 getObjects getter 并使用您自己的对象数组,这些对象可以以 [super.objects mutableCopy] 开头。然而,很大程度上取决于 PF 类是在内部使用 _objects 还是在内部使用 self.objects。它似乎不太适合编辑。尝试覆盖 getObjects 以查看是否有效。甚至不确定您是否可以在 objc 中这样做。否则我认为您将需要使用删除通知删除解析中的数据,然后如果无法删除真实对象,则重新加载表或编写自己的 UITableViewController。
  • 我认为我需要子类化 PFQueryTableController 以从 self.objects 创建一个可变数组,然后覆盖 objectAtIndexPath 以从我的可变数组而不是 self.objects 返回相关对象。这样我就可以随意调用 removeAtIndex(indexpath)
  • 不幸的是,该表仍然会得到 numberOfRowsForSection 错误,因为它将基于其内部 self.objects.count 大小。因此,它最终会通过 objectAtIndexPath 向您询问原始行数。因此我的建议是,除非您可以覆盖 getObjects,否则我认为这是不可能的。
  • 我希望我可以重写 numberOfRowsInSection 方法以返回可以更新的可编辑对象的计数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多