在通知观察器中重新加载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,则没有问题。但我更喜欢在我的应用程序中使用通知中心。
非常感谢。
答案 0 :(得分:2)
如果这是一个基于视图的表视图(可能隐式)从NIB加载其视图,则每次加载NIB时都会调用其awakeFromNib
方法。来自here:
注意:调用
makeViewWithIdentifier:owner:
会导致awakeFromNib
在您的应用中多次调用。这是因为makeViewWithIdentifier:owner:
使用传入的所有者加载NIB, 并且所有者也会收到awakeFromNib
电话,即使它是 已经醒了。
在您的情况下,您每次都会注册通知。因此,您已经多次注册,并且每次注册时都会收到一次通知。
答案 1 :(得分:0)
您没有删除观察者。我的猜测是你多次进入该视图控制器,因此多次注册相同的通知。因此,当触发通知时,会多次调用回调。