簡體   English   中英

將.xib文件中TableCellView中項目的出口設置為自定義NSTableCellView子類

[英]Set the outlet of the item in TableCellView within the .xib file to the custom NSTableCellView subclass

我想用內容填充我的NSTableView 每個表單元行有3個項目(2個NSTextFields和1個NSImageView )。 為此,我創建了一個自定義NSTableCellView ,我想在其中設置3個項目的@IBOutlets並在其中設置它們的值。 但是,當我嘗試設置引用出口時,唯一的選擇是創建一個動作。

當我嘗試編寫@IBOutlet weak var personName: NSTextfield並設置引用時,我無法執行此操作,因為“ xcode無法在當前工作空間中找到該類”

當我在main.storyboard內創建NSTableView ,可以設置出口引用。 那么.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-subclass中

在我看來,您正在為此付出更多的努力。 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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM