NSTableView& NSNotificationCenter奇怪的行为

时间:2014-06-23 04:59:28

标签: macos cocoa swift nstableview nsnotificationcenter

在通知观察器中重新加载NSTableView数据时,我的行为非常奇怪。

class MainWindowController: NSWindowController, NSTableViewDataSource, NSTableViewDelegate
{
    var data: String[] = []

    @IBOutlet var filesTableView: NSTableView!

    override func awakeFromNib()
    {
        super.awakeFromNib()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "droppedFiles:", name: DroppedFilesNotification.notificationName, object: nil)
    }

    func droppedFiles(notification: NSNotification!)
    {
        data += ["123"]
        println(data.count)

        filesTableView.reloadData()
    }

    func numberOfRowsInTableView(tableView: NSTableView!) -> Int
    {
        return data.count
    }

    @IBAction func crazyTest(AnyObject)
    {
       NSNotificationCenter.defaultCenter().postNotificationName(DroppedFilesNotification.notificationName, object: self, userInfo: [DroppedFilesNotification.fileNamesParameterName: ["123"]])
    }
}

第一次调用crazyTest函数显示:

1

madTest函数的秒调用显示:

2
3
4

第三次调用crazyTest函数显示数字5-13。

如果我们要从droppedFiles函数中删除filesTableView.reloadData(),那么除了表格视图没有更新之外,一切正常。知道为什么会这样,以及如何在那里重新加载表视图?

修改

此外,如果直接调用droppedFiles函数而不是使用NSNotificationCenter,则没有问题。但我更喜欢在我的应用程序中使用通知中心。

非常感谢。

2 个答案:

答案 0 :(得分:2)

如果这是一个基于视图的表视图(可能隐式)从NIB加载其视图,则每次加载NIB时都会调用其awakeFromNib方法。来自here

  

注意:调用makeViewWithIdentifier:owner:会导致awakeFromNib   在您的应用中多次调用。这是因为   makeViewWithIdentifier:owner:使用传入的所有者加载NIB,   并且所有者也会收到awakeFromNib电话,即使它是   已经醒了。

在您的情况下,您每次都会注册通知。因此,您已经多次注册,并且每次注册时都会收到一次通知。

答案 1 :(得分:0)

您没有删除观察者。我的猜测是你多次进入该视图控制器,因此多次注册相同的通知。因此,当触发通知时,会多次调用回调。