NSTextField使用绑定在初始化后不更新

时间:2016-06-29 06:29:29

标签: xcode swift cocoa swift2 cocoa-bindings

我从JSON导入数据以用作CollectionView中某些项的模型,似乎它们正在被初始化,并且具有正确数量的元素。但由于某些原因,representedObject(下面为morpheme别名)最初返回nil。因此,如果nil值是显示的值,则为占位符。

如果单击这些项目,我将其设置为在日志中显示所单击项目的名称,并且它可以正常工作,并且不会返回调试默认值。因此,我猜测存在并发问题。

有关详细信息,这些项目是手动原型,因为XCode 7仍然没有使用集合项原型修复segue错误。

这是一个截图,我希望能够获得以下所有重要信息:

enter image description here

以下是单元格的控制器/转发类代码:

///Acts as view controller for the items of the morpheme collection
public class MorphemeCell: NSCollectionViewItem, NSTextViewDelegate{

    var backgroundColor = NSColor.clearColor()

    var morphemeLabel: String{
        get{
            return morpheme?.morphemeDisplayName ?? "Morpheme"
        }
    }

    var allomorphsLabel: String{
        get{
            return (morpheme?.allomorphsAsString ?? "Allomorphs")
        }
    }

    ///The morpheme data contained in the cell
    public var morpheme : Morpheme?{
        get{
            return representedObject as? Morpheme
        }
        set{
            representedObject = newValue
        }
    }

    required public init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    ///Detects clicks on each item
    public override func mouseUp(theEvent: NSEvent) {
        Swift.print("Clicked on " + morphemeLabel)
        backgroundColor = NSColor.blueColor()
    }
}

不确定是否需要,但以下是主窗口的ViewController执行一些设置/加载功能。

enter image description here

加载代码本身:

///Loads morpheme data into memory and then into the collection view
func loadMorphemeData(){
    //Open morphemes.json and begin parsing
    let morphemeDataPath = "morphemes"
    if let file = NSBundle.mainBundle().URLForResource(morphemeDataPath, withExtension: "json")
    {
        let data = NSData(contentsOfURL: file)
        let json = JSON(data:data!)

        //Create Morpheme objects passing in JSON elements
        for morphemeElement in json{
            let toAdd = Morpheme(JSONElement: morphemeElement)
            fullMorphemesList.append(toAdd)
        }
        ///TODO Use full range or filters in final product
        let morphemesToLoad = fullMorphemesList[0...100]
        collectionView.content.appendContentsOf(Array(morphemesToLoad) as [AnyObject])
    }
    else
    {
        print("Resource Failure")
    }

所以,回顾一下:我似乎需要延迟collectionView的设置,或者在数据进入后了解如何更新标签。 非常感谢您的帮助!我对Cocoa框架非常陌生,所以它是一个很好的。

1 个答案:

答案 0 :(得分:2)

采取不同的路线:将您的标签绑定到self.morpheme.morphemeDisplayName。然后设置" Null Placeholder"文本是" Morpheme" (在右侧面板中,查看绑定设置下方的文本编辑列表)。最后使属性morphemeDisplayName动态化:

 dynamic var morphemeDisplayName: String? 

显然,你不再需要单元格内的morphemeLabel属性了。

单元格的语素属性也必须是动态的,或者如果有基于setter的属性,你可以调用:

 set {
 willChangeValueForKey("morpheme") 
 <whatever variable> = newValue 
 didChangeValueForKey("morpheme") 
 }

按原创海报编辑:

此外,为了避免绑定同步问题,使用viewWillAppear()代替viewDidLoad()导致数据加载问题,并且&#34;冻结标签&#34;。