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