将.xib文件中TableCellView中项目的出口设置为自定义NSTableCellView子类

问题描述 投票:0回答:1

我想用内容填充我的NSTableView。每个表格单元格行有3个项目(2个NSTextFields和1个NSImageView)。为此,我创建了一个自定义NSTableCellView,我想设置3个项目的@IBOutlets,为它们设置值。但是当我尝试设置引用插座时,唯一的选择是创建一个动作。

当我尝试编写@IBOutlet weak var personName: NSTextfield然后设置引用时,我不能因为“xcode无法在当前工作空间中找到该类”

当我创建一个main.storyboard的NSTableViewinside时,我可以设置出口参考。那么.storyboard和.xib之间的不同行为是什么?

当我尝试将@IBOutlet与项目“人名”连接时 我的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子类。

swift macos nstableview iboutlet nstablecellview
1个回答
1
投票

在我看来,你正在努力实现这一目标。 makeView为您提供了对单元格的引用。因此,您可以直接访问其成员。不需要出口(这就是为什么Xcode不会为你制作它们。)

我无法很好地阅读你的截图,告诉我们如何定义文本字段(旧眼睛),所以我只能从自定义单元类的工作演示中给出一个通用示例:

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习惯于将类型的第一个字母(类,结构,枚举,协议)和小写方法和属性大写。不影响代码编译的方式,但它有助于其他Swifties读取它。

这是另一个可能有用的例子:

    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
    }
© www.soinside.com 2019 - 2024. All rights reserved.