我有一个基于视图的NSTableView,其中所有单元格都是可编辑的。每次用户从视图中修改textField时,我都需要刷新模型中的数据。
我找到的所有文档都与基于单元格的NSTableView相关。
有没有人对此有所了解?
编辑:
我正在使用数据源来填充此NSTableView。
这是NSTableView控制器的代码
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
@IBOutlet var globalView: NSView!
@IBOutlet var songsTableView: NSTableView!
var tableContents = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
for (song) in songManager.songs {
var obj = Dictionary<String,String>()
obj["title"] = song.title
obj["artist"] = song.artist
tableContents.addObject(obj)
}
songsTableView.reloadData()
}
func numberOfRowsInTableView(tableView: NSTableView) -> Int {
return tableContents.count
}
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?{
var obj = tableContents[row] as Dictionary<String,String>
let column = tableColumn?.identifier
var cellView = tableView.makeViewWithIdentifier(column!, owner: self) as NSTableCellView
if column == "title" {
cellView.textField?.stringValue = obj["title"]!
}
if column == "artist" {
cellView.textField?.stringValue = obj["artist"]!
}
cellView.textField?.editable = true
return cellView
}
}
这是管理数据的类的代码。
var songManager = SongManager()
struct song {
var title = "No name"
var artist = "No artist"
}
class SongManager: NSObject {
var songs = [song]()
func addSong(title: String, artist: String) {
songs.append(song(title: title, artist: artist))
}
}
我没有触及故事板默认创建的行,所以我猜它包含一个NSTextField。
我会显示数据,但无法检测用户何时尝试修改文本字段。
答案 0 :(得分:0)
考虑到当前设置的方式,最简单的方法可能是将文本字段的操作选择器连接到目标(例如控制器)上的操作方法。您可以在IB或tableView(_:viewForTableColumn:row:)
方法中执行此操作。
在该操作方法中,您可以调用songsTableView.rowForView(sender)
来确定编辑了哪一行。每个列的文本字段都有不同的操作方法,例如changeTitle()
或changeArtist()
,以便您知道编辑了哪个列。 (您也可以使用songsTableView.columnForView(sender)
,然后使用songsTableView.tableColumns[col]
中的索引获取表列,并检查返回的列identifier
。为此,您将分配特定的标识符到列而不是让IB自动分配它们。)
获得该行后,您可以使用var obj = tableContents[row] as Dictionary<String,String>
查找字典,并将适用于操作方法(或列标识符)的键值设置为发件人stringValue
。