Swift-在NSTableView中使用复选框获取行索引
我正在斯威夫特学习可可。我使用Viewbased创建了一个NSTableView 我还将复选框操作连接到ViewController。但是当我点击复选框时,它打印了-1而不是行索引。我必须先选择行,然后单击复选框以获得正确的索引号。每行上的每个复选框或按钮是否都可以获取行索引?这是我的密码: 进口可可Swift-在NSTableView中使用复选框获取行索引,swift,cocoa,checkbox,nstableview,Swift,Cocoa,Checkbox,Nstableview,我正在斯威夫特学习可可。我使用Viewbased创建了一个NSTableView 我还将复选框操作连接到ViewController。但是当我点击复选框时,它打印了-1而不是行索引。我必须先选择行,然后单击复选框以获得正确的索引号。每行上的每个复选框或按钮是否都可以获取行索引?这是我的密码: 进口可可 let data: [String] = ["Apple", "Microsoft", "IBM", "Tesla", "SpaceX", "Boeing" , "Nasa"] class
let data: [String] = ["Apple", "Microsoft", "IBM", "Tesla", "SpaceX",
"Boeing" , "Nasa"]
class ViewController: NSViewController, NSTableViewDelegate,
NSTableViewDataSource {
override func viewDidLoad() {
super.viewDidLoad()
self.table.delegate = self
self.table.dataSource = self
self.table.reloadData()
// Do any additional setup after loading the view.
}
@IBOutlet weak var table: NSTableView!
@IBAction func CheckClicked(_ sender: Any) {
print(self.table.selectedRow)
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func numberOfRows(in tableView: NSTableView) -> Int {
return data.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn:
NSTableColumn?, row: Int) -> NSView? {
if (tableColumn?.identifier)!.rawValue == "NameColumn"
{
if let cell = tableView.makeView(withIdentifier:
NSUserInterfaceItemIdentifier(rawValue: "NameColumn"), owner: self)
as? NSTableCellView
{
cell.textField?.stringValue = data[row]
return cell
}
}
else if (tableColumn?.identifier)!.rawValue == "CheckColumn"
{
if let cell = tableView.makeView(withIdentifier:
NSUserInterfaceItemIdentifier(rawValue: "CheckColumn"), owner: self)
as? NSButton
{
return cell
}
}
return nil
}
func tableViewSelectionDidChange(_ notification: Notification) {
print(self.table.selectedRow)
}
}
这就是您想要的,但是更好的实现是将action与NSTableCellView子类一起使用
@IBAction func CheckClicked(_ sender: NSButton) {
// print(self.table.selectedRow)
let row = table.row(for: sender)
print("Button row \(row)")
}
我只能基于NSButton创建一个子类
class myCustomView: NSButton{
@IBOutlet weak var CheckButton: NSButtonCell!
}
虽然我不能更改这些按钮单元格的标题
if (tableColumn?.identifier)!.rawValue == "CheckColumn"
{
if let cell = tableView.makeView(withIdentifier:
NSUserInterfaceItemIdentifier(rawValue: "CheckColumn"), owner: self)
as? myCustomView
{
cell.CheckButton.title = data[row]
return cell
}
}
我不知道为什么Xcode不允许我基于NSTableCellView创建子类。选中的iAction应该转到NSTableCellView子类。感谢您的指导。我是可可豆开发新手。我没有找到任何有关高级nstableview的教程。您能告诉我如何创建一个子类吗?首先,您将创建一个新的file->Cocoa类(基于NSTableCellView)。然后在Interface Builder中将子类指定给表视图单元。现在,您可以在子类中设置IBOutlets/IBActions,将其连接到表单元格中的控件。如果在单元格视图子类或表视图控制器中执行操作很有用,则这取决于您将要执行的所有操作,但在大多数情况下,您将为表视图单元格指定一个objectValue并对其进行操作。我确实遵循了您的指导,但仍停留在control+上,将outlet和操作拖动到子类文件。这是Xcode的错误吗?我使用的是Xcode 8.3.3,因为这个版本允许我连接到iTunes library framework,没有任何问题。如果在助手编辑器中打开新创建的子类,它应该可以使用控件拖动。请注意在IB中选择右侧控件。在某些情况下,在左侧的大纲视图中选择控件并从中拖动连接(IBAction)更容易。