当我删除一个包含核心数据的单元格时,同一个单元格显示两次
Posted
技术标签:
【中文标题】当我删除一个包含核心数据的单元格时,同一个单元格显示两次【英文标题】:When I delete a cell with Core data, same cell show twice 【发布时间】:2017-02-24 05:44:03 【问题描述】:当我删除一个包含核心数据的单元格时,我遇到了一个问题。 当我在单元格之间删除时,已删除单元格的下一个单元格在下一个单元格之后变得相同。它看起来像下面。
看起来像。当我出去并返回表格视图时,它已正确删除。 但是,当我删除最后一个单元格时,它看起来不错。它运作良好!它不仅发生在这种情况下(删除最后一个单元格)!
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
if editingStyle == .delete
//FIXME: Delete
let quote:Quotes = quotes![indexPath.row]
self.context.delete(quote)
do
try self.context.save()
self.quotes?.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
catch let error
print(error)
func controllerWillChangeContent(controller: NSFetchedResultsController<NSFetchRequestResult>)
self.tableview.beginUpdates()
func controllerDidChangeContent(controller: NSFetchedResultsController<NSFetchRequestResult>)
self.tableview.endUpdates()
我不知道是怎么回事,请告诉我这种情况:(
我的模拟器是 v10.1,Xcode 版本是 8.2.1
【问题讨论】:
提供一些截图 @GaneshKumar 我刚刚添加了它! @lucy 删除单元格或滑动显示编辑选项时会发生这种情况? 而不是删除tableview中的行删除数组中的适当值然后重新加载tableview... @Dhivya 无需重新加载整个 tableView 即可删除一行。您可以简单地使用 deleteRows 及其击球手选项, 【参考方案1】:Blow Code 对我有用!
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
if editingStyle == .delete
//FIXME: Delete
let quote:Quotes = quotes![indexPath.row]
self.context.delete(quote)
do
try self.context.save()
deleteRow(indexPath)
catch let error
print(error)
func deleteRow(indexPath : NSIndexPath)
self.quotes?.remove(at: indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)
【讨论】:
感谢您的回答!但是,它仍然遇到同样的问题:-(【参考方案2】:尝试像这样包装对deleteRows
的调用:
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .fade)
tableView.endUpdates()
来自Apple UIKit documentation
如果您不在此块内进行插入、删除和选择调用,则行数等表属性可能会变得无效。
【讨论】:
谢谢你!我错过了那个信息:(对不起,现在我更新了!我用两个函数处理它 如果这对你有用,你能接受这个答案吗?谢谢。begin/endUpdates
在这种情况下完全没用(单个删除操作)。请参阅讨论开头的...如果您希望后续插入s、删除和选择操作s...同时。无论如何,这些方法都是在委托方法中调用的。
谢谢。我不确定是否有必要,这就是为什么我说“尝试”这样做。我不记得自己必须这样做,但文档的模糊性 - “表属性可能变得无效” - 向我暗示这可能是必要的。我认为这很容易尝试。如果更改是在 tableview 委托方法中完成的,我也没有在文档中看到任何内容说这些语句是不必要的。
这是一个单个insert/delete/move
操作与多个操作同时的问题。 OP 使用NSFetchedResultsController
,它在更改前后始终调用controllerWillChangeContent
和controllerDidChangeContent
。【参考方案3】:
问题是单元格高度。与屏幕高度相比,单元格高度太大。 当我更改单元格高度时,效果很好。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 20 //before: view.frame.width
但是,我想创建形状单元格。所以,我在顶部添加了刷新控制器。
var refreshControl: UIRefreshControl!
override func viewDidLoad()
super.viewDidLoad()
refreshControl = UIRefreshControl()
refreshControl.tintColor = UIColor(red: 0.996, green: 0.878, blue: 0.196, alpha: 1.00)
refreshControl.addTarget(self, action: #selector(self.refresh), for: UIControlEvents.valueChanged)
tableview.addSubview(refreshControl)
func refresh()
self.tableview.reloadData()
self.refreshControl?.endRefreshing()
这不是完美的答案,但它可能是次优策略。如果您有比现在更好的方法,请发表评论:-)
【讨论】:
以上是关于当我删除一个包含核心数据的单元格时,同一个单元格显示两次的主要内容,如果未能解决你的问题,请参考以下文章
当我单击 tableview 单元格时,UITextfield 没有显示文本?
当我在按钮操作上从 TableView 中删除单元格时,应用程序崩溃了 - iOS Swift