[英]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.