在基于视图的 NSTableView 中根据用户的输入编辑模型中的数据

Edit data in the model according to the user's input in view-based NSTableView

我有一个基于视图的 NSTableView,其中所有单元格都是可编辑的。每次用户从视图修改文本字段时,我都需要从模型中刷新数据。

我找到的所有文档都与基于单元格的 NSTableView 有关。

有人知道这件事吗?

编辑:

我正在使用数据源来填充此 NSTableView。

这是NSTableView的Controller的代码

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
}    
}

这是管理数据的 class 的代码。

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。

我可以显示数据,但无法检测到用户何时尝试修改文本字段。

考虑到当前的设置方式,最简单的方法可能是将文本字段的操作选择器连接到目标(例如您的控制器)上的操作方法。您可以在 IB 或您的 tableView(_:viewForTableColumn:row:) 方法中执行此操作。

在该操作方法中,您可以调用 songsTableView.rowForView(sender) 来确定编辑了哪一行。每列的文本字段都有不同的操作方法,例如 changeTitle()changeArtist(),以便您知道编辑了哪一列。 (您也可以使用 songsTableView.columnForView(sender),然后使用 songsTableView.tableColumns[col] 中的索引获取 table 列,并检查返回列的 identifier。为此,您将分配特定的标识符到列而不是让 IB 自动分配它们。)

获得该行后,您可以使用 var obj = tableContents[row] as Dictionary<String,String> 查找字典并将适合于操作方法(或列标识符)的键的值设置为发件人的 stringValue