【发布时间】:2015-12-19 13:29:15
【问题描述】:
我对使用 Swift 编程还是很陌生(而且从来没有使用过 Objective C)。我想要做的是当我点击当前表格视图中的一个项目时添加到 NSTableView 中。单击时似乎正在添加项目,但表格似乎没有刷新数组中的新事物。
过去几天我尝试了各种方法,让它在主线程和 UI 线程等上运行 reloadData,但我觉得我只是碰壁了(这肯定不会这么难用几分钟的时间用 Java 做一些如此简单的事情)....
我是否遗漏了一些非常明显的东西? (代码如下)
class TableViewController: NSTableView, NSTableViewDataSource, NSTableViewDelegate {
var items: [String] = ["Eggs", "Milk"]
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result : TableCell = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! TableCell
result.itemField.stringValue = items[row]
return result
}
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return items.count
}
func tableViewSelectionDidChange(notification: NSNotification) {
let index = notification.object!.selectedRow
if (index != -1) {
NSLog("@%d", index)
items.append("Blah")
NSLog("@%d", items.count)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.reloadData()
})
}
}
func relloadData() { //relload is not a typo
self.reloadData()
}
}
【问题讨论】:
-
你的班级是是tableview吗?
relloadData的目的是什么? -
是的(这是我在教程中一直遵循的方式,除非它不是我不知道的最佳实践)。重新加载数据的目的是为了调试。
-
主线程和UI线程是两个线程吗?项目添加了吗?
-
根据我的问题描述,似乎添加了项目,因为每次单击时数组的大小都会增加。我相信它们在同一个线程上运行,但我在主线程或 UI 线程中更新它们仍然不起作用。
-
一般情况下,控制器不应该和表格视图是同一个对象。此外,您需要解释您的 UI 是如何设置的。你用过NIB吗?故事板?还是您以编程方式进行设置?如果是 NIB 或情节提要,它是否既有视图层次结构中自定义类的表视图,又有控制器类的实例(当前是同一个类)作为视图层次结构之外的单独对象?表格视图的委托和数据源是如何连接的?
标签: swift macos cocoa nstableview