将 .xib 文件中 TableCellView 中项目的出口设置为自定义 NSTableCellView 子类
Set the outlet of the item in TableCellView within the .xib file to the custom NSTableCellView subclass
我想用内容填充我的NSTableView
。每个 table 单元格行有 3 个项目(2 NSTextFields
和 1 NSImageView
)。为此,我创建了一个自定义 NSTableCellView
,我想在其中设置 3 个项目的 @IBOutlets
,以便为它们设置值。但是当我尝试设置引用网点时,唯一的选择是创建一个动作。
当我尝试写 @IBOutlet weak var personName: NSTextfield
然后设置引用时,我不能,因为 "xcode cannot locate the class in the current workspace"
当我在 main.storyboard 中创建 NSTableView
时,我可以设置插座引用。那么.storyboard 和.xib 之间有什么不同的行为?
当我尝试将@IBOutlet 与项目连接时"Person Name"
我的 NSViewController(.xib 的所有者)
class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
@IBOutlet weak var tableView: NSTableView! //ref to tableView in xib
var persons:[Person] = [] //content to fill tableview
override func viewDidLoad() {
super.viewDidLoad()
persons.append(Person(name: "John", age: 23, piRef: "/Users/xy/Desktop/profilePic.png"))
persons.append(Person(name: "Marie", age: 26, piRef: "/Users/xy/Desktop/profilePic.png"))
tableView.delegate = self
tableView.dataSource = self
}
func numberOfRows(in tableView: NSTableView) -> Int {
return persons.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let tableCellView:personTableCell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "defaultRow"), owner: self) as! personTableCell
//NSTableColumn in xib has id "defaulRow"
if let person:Person = persons[row] {
tableCellView.setPerson(person: person) //call method inside NSTableCellView-subclass to set item values
}
return tableCellView
}
}
自定义NSTableCellView子类("personTableCell")
class personTableCell: NSTableCellView {
var person:Person! = nil
//here should be:
//@IBOutlet weak var personName: NSTextField!
//@IBOutlet weak var personAge: NSTextField!
//@IBOutlet weak var personImg: NSImageView!
func setPerson(person: Person) {
self.person = person
self.personName = person.name
self.personAge = person.age
self.personImg = NSImage(byReferencingFile: person.profileImgRef)
}
}
我希望能够将项目出口引用添加到我的 NSTableCellView-子类。
在我看来,你让这件事变得比需要的更难了。 makeView 为您提供了对单元格的引用。因此,您可以直接访问其成员。不需要插座(这就是为什么 Xcode 不会为您制作它们。)
我无法很好地阅读您的屏幕截图以了解文本字段是如何定义的(老眼),所以我只能给您一个来自自定义单元格工作演示的通用示例 class:
class DIYTableViewDelegate: NSObject, NSTableViewDelegate {
var count = 0 // counts the number of views actually created
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let id = tableColumn!.identifier
var view = tableView.makeView(withIdentifier: id, owner: nil) as? CustomTableCellView
if view == nil {
view = createCell(id)
count += 1
}
view!.textField!.stringValue = "\(id.rawValue) \(row) \(view!.count) \(count)"
view!.count += 1
return view
}
}
此外,在 Swift 中习惯将类型(classes、结构、枚举、协议)的首字母大写,而方法和属性的首字母小写。不会影响您的代码的编译方式,但可以帮助其他 Swift 阅读它。
这是另一个可能有帮助的例子:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard let vw = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? CustomTableCellView else { return nil }
vw.textField?.stringValue = String(pictures[row].dropLast(4))
vw.imageView?.image = NSImage(named: pictures[row])
return vw
}
我想用内容填充我的NSTableView
。每个 table 单元格行有 3 个项目(2 NSTextFields
和 1 NSImageView
)。为此,我创建了一个自定义 NSTableCellView
,我想在其中设置 3 个项目的 @IBOutlets
,以便为它们设置值。但是当我尝试设置引用网点时,唯一的选择是创建一个动作。
当我尝试写 @IBOutlet weak var personName: NSTextfield
然后设置引用时,我不能,因为 "xcode cannot locate the class in the current workspace"
当我在 main.storyboard 中创建 NSTableView
时,我可以设置插座引用。那么.storyboard 和.xib 之间有什么不同的行为?
当我尝试将@IBOutlet 与项目连接时"Person Name"
我的 NSViewController(.xib 的所有者)
class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
@IBOutlet weak var tableView: NSTableView! //ref to tableView in xib
var persons:[Person] = [] //content to fill tableview
override func viewDidLoad() {
super.viewDidLoad()
persons.append(Person(name: "John", age: 23, piRef: "/Users/xy/Desktop/profilePic.png"))
persons.append(Person(name: "Marie", age: 26, piRef: "/Users/xy/Desktop/profilePic.png"))
tableView.delegate = self
tableView.dataSource = self
}
func numberOfRows(in tableView: NSTableView) -> Int {
return persons.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let tableCellView:personTableCell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "defaultRow"), owner: self) as! personTableCell
//NSTableColumn in xib has id "defaulRow"
if let person:Person = persons[row] {
tableCellView.setPerson(person: person) //call method inside NSTableCellView-subclass to set item values
}
return tableCellView
}
}
自定义NSTableCellView子类("personTableCell")
class personTableCell: NSTableCellView {
var person:Person! = nil
//here should be:
//@IBOutlet weak var personName: NSTextField!
//@IBOutlet weak var personAge: NSTextField!
//@IBOutlet weak var personImg: NSImageView!
func setPerson(person: Person) {
self.person = person
self.personName = person.name
self.personAge = person.age
self.personImg = NSImage(byReferencingFile: person.profileImgRef)
}
}
我希望能够将项目出口引用添加到我的 NSTableCellView-子类。
在我看来,你让这件事变得比需要的更难了。 makeView 为您提供了对单元格的引用。因此,您可以直接访问其成员。不需要插座(这就是为什么 Xcode 不会为您制作它们。)
我无法很好地阅读您的屏幕截图以了解文本字段是如何定义的(老眼),所以我只能给您一个来自自定义单元格工作演示的通用示例 class:
class DIYTableViewDelegate: NSObject, NSTableViewDelegate {
var count = 0 // counts the number of views actually created
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let id = tableColumn!.identifier
var view = tableView.makeView(withIdentifier: id, owner: nil) as? CustomTableCellView
if view == nil {
view = createCell(id)
count += 1
}
view!.textField!.stringValue = "\(id.rawValue) \(row) \(view!.count) \(count)"
view!.count += 1
return view
}
}
此外,在 Swift 中习惯将类型(classes、结构、枚举、协议)的首字母大写,而方法和属性的首字母小写。不会影响您的代码的编译方式,但可以帮助其他 Swift 阅读它。
这是另一个可能有帮助的例子:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard let vw = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? CustomTableCellView else { return nil }
vw.textField?.stringValue = String(pictures[row].dropLast(4))
vw.imageView?.image = NSImage(named: pictures[row])
return vw
}