簡體   English   中英

在 NSCollectionViewItem 中重置的變量

[英]Variables being reset in NSCollectionViewItem

我正在嘗試從父 NSCollectionViewDataSource 更新 NSCollectionViewItem 內的 NSTextField 標題。 這是我的代碼。

NSCollectionViewDataSource

    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
        let cell = collectionView.makeItem(
          withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "MacDeviceItem"),
          for: indexPath
        ) as! MacDeviceItem

        let device = devicesList[indexPath.item]
        cell.deviceName = "Hello World"
        return cell
    }

NSCollectionViewItem

class MacDeviceItem: NSCollectionViewItem {
    dynamic public var deviceName:String = "Unknown Device Name"

    @IBOutlet weak var deviceImage: NSImageView!
    @IBOutlet weak var deviceNameLabel: NSTextField!
    @IBOutlet weak var deviceStatusLabel: NSTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        view.wantsLayer = true
        updateSelection()
    }

    override func viewDidLayout() {
        super.viewDidLayout()
        view.layer?.cornerRadius = 7
        print(deviceName)
    }

    override func viewDidAppear() {
        self.deviceNameLabel?.stringValue = deviceName
    }

    private var selectionColor : CGColor {
        let selectionColor : NSColor = (isSelected ? .controlAccentColor : .clear)
        return selectionColor.cgColor
    }

    private var selectionTextColor : NSColor {
        let selectionTextColor : NSColor = (isSelected ? .selectedMenuItemTextColor : .controlTextColor)
        return selectionTextColor
    }

    override var isSelected: Bool {
        didSet {
            super.isSelected = isSelected
            updateSelection()
            // Do other stuff if needed
        }
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        updateSelection()
    }

    private func updateSelection() {
        view.layer?.backgroundColor = self.selectionColor
        deviceNameLabel?.textColor = self.selectionTextColor
        deviceStatusLabel?.textColor = self.selectionTextColor
    }

}

如果我在 viewDidLoad 上打印 deviceName 的值,則該值就在那里。 但是,當嘗試在 ViewDidAppear 中設置 label 或沒有任何反應時,變量已重置為默認值。 我對 Swift 很陌生,但以前在 Objective-C 方面有過一些經驗,但不記得有這個問題。

在這里,您實際上並不需要變量deviceName: String 您可以直接將值設置為deviceNameLabel: NSTextField ,如下所示:

cell.deviceNameLabel.stringValue = "Hello World"

如果您確實需要該變量,您可以嘗試didSet方法,如下所示:

public var deviceName:String = "Unknown Device Name" {
    didSet {
        cell.deviceNameLabel.stringValue = deviceName
    }
}

暫無
暫無

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

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