我对使用 Swift 进行编程仍然很陌生(从来没有使用过 Objective C)。我想要做的是在我单击当前 TableView 中的项目时添加到 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()
}
}
最佳答案
如果您将用户界面绑定(bind)到 View Controller 子类的 items
属性,则需要将其标记为动态变量:
dynamic var items: [String] = ["Eggs", "Milk"]
将 dynamic
关键字放在属性声明之前,我认为它会解决您的问题。
请注意,Ken 的评论也提出了一个很好的观点,即这段代码可能应该编写为 NSViewController 子类,而不是 NSTableView 的子类。
如果您正在使用 Storyboard,自定义 View Controller 子类将是包含您的 TableView 的 View 的 View Controller 对象。如果您为 View 使用 xib 文件,则 View Controller 子类将是文件的所有者。在任何一种情况下,您都可以将 TableView 的委托(delegate)和数据源导出连接到该对象。
关于swift - 为什么 NSTableView 不重新加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34371324/