【问题标题】:Why is NSTableView not reloading?为什么 NSTableView 没有重新加载?
【发布时间】: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


【解决方案1】:

如果您将用户界面绑定到视图控制器子类的 items 属性,则需要将其标记为动态变量:

dynamic var items: [String] = ["Eggs", "Milk"]

dynamic 关键字放在属性声明之前,我认为它会解决您的问题。

请注意,Ken 的评论也提出了一个很好的观点,即这段代码可能应该写为 NSViewController 的子类,而不是 NSTableView 的子类。

如果您使用 Storyboard,自定义视图控制器子类将是包含您的表视图的视图的视图控制器对象。如果您为视图使用 xib 文件,则视图控制器子类将是文件的所有者。无论哪种情况,您都可以将表视图的委托和数据源出口连接到该对象。

【讨论】:

  • 这将是绑定的答案。问题是关于不使用 KVO 的数据源。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多