问题描述
当我尝试调用 reloadData()
时,我在 NSTableView 行为中遇到了一个奇怪的现象。调用 reloadData()
后,我的 NSTableView 根据数据源正确显示了新的表格单元格,但奇怪的是旧单元格并未完全“删除”,而是在其中留下了“鬼迹”或“标记”表视图。
见下图:
我已经用尽了我能想到的所有方法,包括prepareForReuse
,我什至在重新加载数据之前从超级视图(NSTableView)中删除所有单元格,并将cell.identifier = ""
设置为强制表查看每次重新加载创建一个全新的单元格,但这也不起作用。
我的代码很简单,如下
控制器代码:
// TodoListTableViewController.swift
eventStore.fetchReminders(matching: predicateIncompleteReminders) { reminders in
self.reminders = reminders
dispatchQueue.main.async { [self] in
todoListTableView.reloadData()
}
}
// still in TodoListTableViewController.swift
func tableView(_ tableView: NSTableView,viewFor tableColumn: NSTableColumn?,row: Int) -> NSView? {
let reminder = reminders[row]
let itemCell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: CellViewIdentifierSet.TodoItemCellView.rawValue),owner: self) as! TodoItemCellView
itemCell.todoItemTextField.stringValue = reminder.title
itemCell.todoColorTextField.textColor = reminder.calendar.color
if let date = reminder.dueDateComponents?.date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
itemCell.todoStartTimeTextField.stringValue = dateFormatter.string(from: date)
} else {
itemCell.todoStartTimeTextField.stringValue = ""
}
return itemCell
}
import Cocoa
class TodoItemCellView: NSTableCellView {
@IBOutlet var todoColorTextField: NSTextField!
@IBOutlet var todoItemTextField: NSTextField!
@IBOutlet var todoStartTimeTextField: NSTextField!
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
todoItemTextField.maximumNumberOfLines = 2
}
override func prepareForReuse() {
super.prepareForReuse()
todoItemTextField.stringValue = ""
todoStartTimeTextField.stringValue = ""
}
}
我非常有信心,从逻辑上讲,没有什么是错的。 我还仔细检查了我的故事板中只有一个表格视图并且没有双重堆叠视图。
我正在我的 MacBook Pro(2015 年中)上运行该应用。
编辑:我做了一个视图层次调试会话。视图层次是这样的:
假设我的 MacBook Pro 2015 的显示器质量不佳,无法正确刷新内容,这是否安全?而且这种行为不会出现在其他人的电脑上吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)