xcode - 使用绑定(bind)的 NSTextFields 在初始化后不更新

标签 xcode swift cocoa swift2 cocoa-bindings

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

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

有关更多详细信息,这是手动制作原型(prototype)的项目,因为 XCode 7 仍未修复集合项目原型(prototype)的 segue 错误。

这是一张截图,我希望它能包含所有重要信息:

enter image description here

这里是 cell 的 Controller /delagating 类的详细代码:

///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 框架还很陌生,所以对它一窍不通。

最佳答案

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

 dynamic var morphemeDisplayName: String? 

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

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

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

由原发布者编辑:

此外,为了避免绑定(bind)同步问题,事实证明使用 viewWillAppear() 而不是 viewDidLoad() 会导致数据加载和“卡住标签”问题".

关于xcode - 使用绑定(bind)的 NSTextFields 在初始化后不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38091904/

相关文章:

iphone - 我怎样才能避免 AlAssetLibrary 中的位置服务?我可以在不使用定位服务的情况下使用 AlAssetLibrary 检索文件吗?

IOS Swift - 从 NURLSESSION 获取统计数据后转到另一个 View

objective-c - 在 Cocos2d 中删除 Sprite 导致崩溃

objective-c - 如何使 NSSlider 的一部分停在刻度线处?

macos - SceneKit 从动画 SCNNode 中获取当前 SCNNode 位置

ios - 获取 UICollectionView 中的列

ios - cocoa 荚 : Unable to remove the Pod from project

ios - 在按钮函数中添加两个坐标以启动 mapKit 并开始两点之间的导航(Swift)

ios - 基于 Swift NSLayoutConstraint 方程的常量

arrays - 如何使用 UITextField 输入附加数组?