ビューベースのセルである TaskCell と NonTaskCell を含む NSTableView があり、次のように作成します。
func tableView (tableView: NSTableView,
viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cellRow = row
var theData = data[row]
var cell: TaskCellProtocol? = nil
switch Int(theData.taskType!.intValue) {
case TaskType.Issue.rawValue:
cell = self.tableView?.makeViewWithIdentifier(kTaskCellIdentifier, owner: self) as? TaskCell
default:
cell = self.tableView?.makeViewWithIdentifier(kNonTaskCellIdentifier, owner: self) as? NonTaskCell
}
assert(cell != nil, "Cell can't be nil, check the identifier")
// Add data to the cell
TaskCellPresenter(cell: cell!).presentData(theData, andPreviousData: row < data.count-1 ? data[row+1] : nil)
cell?.didAddCell = { (cell: NSTableRowView) in
RCLog(cell)
let row = tableView.rowForView(cell as! NSTableRowView)
tableView.enumerateAvailableRowViewsUsingBlock({ (rowView, rowIndex) -> Void in
RCLog(rowView)
if rowView == cell as! NSTableRowView {
RCLog("found it")
self.didAddRow?(row: cellRow)
}
})
}
RCLog(cell)
return cell as? NSView
}
セルを作成すると、このログが示すように行が -1 になります。
TasksScrollView.swift:114: Optional(<Jirassic.TaskCell: 0x100e1eb60> - row: -1)
TasksScrollView.swift:114: Optional(<Jirassic.TaskCell: 0x100e269f0> - row: -1)
TasksScrollView.swift:114: Optional(<Jirassic.TaskCell: 0x100b120e0> - row: -1)
TasksScrollView.swift:114: Optional(<Jirassic.NonTaskCell: 0x100b181d0> - row: -1)
セル内のボタンをクリックすると、セル自体をパラメーターとして didAddCell を呼び出します。RCLogCell(セル) は
TasksScrollView.swift:101: <Jirassic.TaskCell: 0x100e269f0> - row: -1
列挙子のログは次のとおりです。
TasksScrollView.swift:107: <NSTableRowView: 0x6000001a24c0> - row: 0
TasksScrollView.swift:107: <NSTableRowView: 0x6000001a1b20> - row: 1
TasksScrollView.swift:107: <NSTableRowView: 0x6180001a0540> - row: 2
TasksScrollView.swift:107: <NSTableRowView: 0x6180001a07e0> - row: 3
アップルのドキュメントから、セルが NSTableRowView またはサブクラスでない場合、rowForView は -1 を報告することを読みました。ただし、私の TaskCell は NSTableRowView であり、何が起こっているのかわかりません。内部で別の行を作成したようです。何か案は?git https://github.com/ralcr/Jirassic/blob/master/Jirassic/TasksScrollView.swiftのコードに従うこともできます。