如何从 NIB 创建自定义 NSTableCellView?
How to create a custom NSTableCellView from a NIB?
我是 Swift 的新手,我正在为 NSTableView 苦苦挣扎!我正在尝试从 NIB 创建自定义 NSTableCellView。
我想从 NIB 加载单元格,因为:
- 它将在多个列和多个 table-视图中重复使用
- 它在视觉上和功能上(相对)会很复杂
- 它可能会在开发过程中进化
我能够在我的 table 视图中加载单元格,但我在调试中收到“无法连接出口...缺少 setter 或实例变量”错误当我尝试用数据填充视图时。自定义单元格在 table 视图中可见,但似乎没有被实例化。
我在网上搜索了几个小时的解决方案!帮助我错过了什么?
这是我的 TableViewController...
protocol TableViewDelegate {
func itemWithIndexWasSelected(value: Int)
}
class TableViewController: NSViewController {
@IBOutlet weak var tableView: NSTableView!
let tableViewData =
[ [ "Column1": "John", "Column2": "Smith", "Hobby": "Birds"],
[ "Column1": "Jane", "Column2": "Doe", "Hobby": "Fish"],
[ "Column1": "Hal", "Column2": "Bernard", "Hobby": "Trees"],
[ "Column1": "Harry", "Column2": "Bell", "Hobby": "Rocks"] ]
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
let customCellNib = NSNib.init(nibNamed: "CustomTableCellView", bundle: nil)
tableView.register(customCellNib, forIdentifier: NSUserInterfaceItemIdentifier("CustomCellView"))
tableView.reloadData()
}
}
extension TableViewController: NSTableViewDataSource, NSTableViewDelegate {
func numberOfRows(in tableView: NSTableView) -> Int {
return tableViewData.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
if tableColumn?.identifier.rawValue == "CustomCell" {
let result: CustomTableCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("CustomCellView"), owner: self) as! CustomTableCellView
result.hobbyLabel?.stringValue = tableViewData[row]["Hobby"]!
result.hobbyButton?.title = "TESTTITLE"
return result
}
else {
let result = tableView.makeView(withIdentifier:(tableColumn?.identifier)!, owner: self) as! NSTableCellView
result.textField?.stringValue = tableViewData[row][(tableColumn?.identifier.rawValue)!]!
return result
}
}
}
我有一个带有同名 XIB 的 CustomTableCellView...
class CustomTableCellView: NSTableCellView {
@IBOutlet weak var hobbyButton: NSButton!
@IBOutlet weak var hobbyLabel: NSTextField!
}
我有一个可以发送或上传的测试项目...非常感谢您的帮助!
这是我看到的:
编辑 xib 时,File's Owner 代理对象表示在运行时作为所有者传递给 makeView(withIdentifier:owner:)
的对象。在这种情况下,所有者对象是视图控制器。您可以将 xib 中文件所有者的 class 设置为 TableViewController
并连接操作。您不能将 File's Owner 的 class 设置为 CustomTableCellView
并连接插座。而是连接 CustomTableCellView
视图对象的出口。
我是 Swift 的新手,我正在为 NSTableView 苦苦挣扎!我正在尝试从 NIB 创建自定义 NSTableCellView。
我想从 NIB 加载单元格,因为:
- 它将在多个列和多个 table-视图中重复使用
- 它在视觉上和功能上(相对)会很复杂
- 它可能会在开发过程中进化
我能够在我的 table 视图中加载单元格,但我在调试中收到“无法连接出口...缺少 setter 或实例变量”错误当我尝试用数据填充视图时。自定义单元格在 table 视图中可见,但似乎没有被实例化。
我在网上搜索了几个小时的解决方案!帮助我错过了什么?
这是我的 TableViewController...
protocol TableViewDelegate {
func itemWithIndexWasSelected(value: Int)
}
class TableViewController: NSViewController {
@IBOutlet weak var tableView: NSTableView!
let tableViewData =
[ [ "Column1": "John", "Column2": "Smith", "Hobby": "Birds"],
[ "Column1": "Jane", "Column2": "Doe", "Hobby": "Fish"],
[ "Column1": "Hal", "Column2": "Bernard", "Hobby": "Trees"],
[ "Column1": "Harry", "Column2": "Bell", "Hobby": "Rocks"] ]
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
let customCellNib = NSNib.init(nibNamed: "CustomTableCellView", bundle: nil)
tableView.register(customCellNib, forIdentifier: NSUserInterfaceItemIdentifier("CustomCellView"))
tableView.reloadData()
}
}
extension TableViewController: NSTableViewDataSource, NSTableViewDelegate {
func numberOfRows(in tableView: NSTableView) -> Int {
return tableViewData.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
if tableColumn?.identifier.rawValue == "CustomCell" {
let result: CustomTableCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier("CustomCellView"), owner: self) as! CustomTableCellView
result.hobbyLabel?.stringValue = tableViewData[row]["Hobby"]!
result.hobbyButton?.title = "TESTTITLE"
return result
}
else {
let result = tableView.makeView(withIdentifier:(tableColumn?.identifier)!, owner: self) as! NSTableCellView
result.textField?.stringValue = tableViewData[row][(tableColumn?.identifier.rawValue)!]!
return result
}
}
}
我有一个带有同名 XIB 的 CustomTableCellView...
class CustomTableCellView: NSTableCellView {
@IBOutlet weak var hobbyButton: NSButton!
@IBOutlet weak var hobbyLabel: NSTextField!
}
我有一个可以发送或上传的测试项目...非常感谢您的帮助!
这是我看到的:
编辑 xib 时,File's Owner 代理对象表示在运行时作为所有者传递给 makeView(withIdentifier:owner:)
的对象。在这种情况下,所有者对象是视图控制器。您可以将 xib 中文件所有者的 class 设置为 TableViewController
并连接操作。您不能将 File's Owner 的 class 设置为 CustomTableCellView
并连接插座。而是连接 CustomTableCellView
视图对象的出口。