NSTableView -setDataSource在由FSEvents触发时不起作用

时间:2008-11-30 00:54:20

标签: objective-c cocoa macos fsevents

所以这就是我所拥有的:

  • 带有NSMutableArray数据源的NSTableView
  • FSEvents监控包含包含表视图数据的文件的文件夹(使用SCEvents表示Objective-C抽象优势)
  • FSEvents触发与UI中的重新加载按钮相同的功能。此函数通过setDataSource:基于所述文件的内容使用新数据源刷新表视图。

以下是发生的事情:

  • 如果我对文件进行了更改,则会触发FSEvent并调用refresh方法。
  • 表视图应该接受的数组确实包含触发FSEvent的更改。
  • setDataSource:将使用正确的数据源发送到NSTableView。
  • 更改未显示在表格视图中!

但是:

  • 如果我点击刷新按钮,它触发与FSEvent完全相同的方法,则会使用新数据更新表格视图。

我也尝试用NSNotification(NSApplicationDidBecomeActiveNotification)替换FSEvent,但同样的事情发生了。

任何人都知道为什么会这样?

编辑:为了澄清,我的问题的主旨是:为什么我的NSTableView在按下按钮时会重新加载,但在由FSEvent或NSNotification触发时不会重新加载?

编辑:感谢diciu,我发现实际上我的所有UI引用在事件触发时都指向0x0,但是当按钮点击触发时它会有效地址。这些对象都在IB中声明,因此在我的代码中没有实例化或分配它们。所以现在我的问题是:我能做些什么来阻止这些指针指向nil?

5 个答案:

答案 0 :(得分:2)

当我们要向表中添加/删除新数据时,我们在NSTableView上调用 reloadData

这可能有助于强制NSTableView重绘。

我不确定这是不是你问的问题。你的问题的措辞有点令人困惑,你陈述了一系列事件,但绝不是一个真正的问题。

答案 1 :(得分:1)

您是否尝试在运行循环的第二次传递中从FSEvent调用您的方法?

[myObject performSelector:@selector(reloadAction:) withObject:nil afterDelay:0.0];

答案 2 :(得分:1)

您是否直接将NSArray设置为表格视图的数据源?

这不是NSTableView的工作方式。数据源必须是符合NSTableDataSource的对象。 NSArray没有。您自己编写数据源;它可能与您当前调用setDataSource:的对象相同。

另一种方法是使用Bindings。

答案 3 :(得分:1)

可能是对刷新方法范围内的表视图的引用无效吗?

即。你确定你没有调用[nil reloadData]而不会产生任何错误吗? 如果您在awakeFromNib之前或在其他情况下设置了对表视图的引用,则刷新代码中的引用可能为nil。

答案 4 :(得分:1)

听起来就像注册事件/通知一样,你传递的是控制器类的另一个实例。