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

时间:2015-03-14 22:13:25

标签: macos cocoa cell edit nstableview

我有一个基于视图的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。

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

1 个答案:

答案 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