使用绑定的 NSTextFields 在初始化后不更新
NSTextFields using bindings not updating after initialization
我正在从 JSON 导入数据以用作 CollectionView 中某些项目的模型,它们似乎正在被初始化,并且具有正确数量的元素。但出于某种原因,representedObject
(下面别名为 morpheme
)最初是 returning nil
。因此,如果显示的是零值,则占位符。
如果您单击这些项目,我已将其设置为在日志中显示所单击项目的名称,它工作正常,并且 return 调试默认值不存在。所以我猜测存在并发问题。
有关更多详细信息,这是手动制作原型的项目,因为 XCode 7 仍未修复集合项目原型的 segue 错误。
这是一张截图,我希望它能包含所有重要信息:
这里是单元格的 controller/delagating class 代码的详细信息:
///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()
}
}
不确定是否需要这样做,但为了以防万一这里主要 window 的 ViewController 执行一些 setup/loading 功能。
加载代码本身:
///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 框架的新手,所以它很笨拙。
采取不同的路线:将您的标签绑定到 self.morpheme.morphemeDisplayName。然后将 "Null Placeholder" 文本设置为 "Morpheme"(在右侧面板中,查看绑定设置下方的文本编辑列表)。最后使 属性 morphemeDisplayName 动态:
dynamic var morphemeDisplayName: String?
显然,您不再需要在单元格内使用 morphemeLabel 属性。
cell的词素属性也必须是动态的,或者如果有setter基础的属性,可以调用:
set {
willChangeValueForKey("morpheme")
<whatever variable> = newValue
didChangeValueForKey("morpheme")
}
发帖人编辑:
此外,为了避免绑定同步问题,使用 viewWillAppear()
而不是 viewDidLoad()
导致了数据加载问题和 "freezing the labels".
我正在从 JSON 导入数据以用作 CollectionView 中某些项目的模型,它们似乎正在被初始化,并且具有正确数量的元素。但出于某种原因,representedObject
(下面别名为 morpheme
)最初是 returning nil
。因此,如果显示的是零值,则占位符。
如果您单击这些项目,我已将其设置为在日志中显示所单击项目的名称,它工作正常,并且 return 调试默认值不存在。所以我猜测存在并发问题。
有关更多详细信息,这是手动制作原型的项目,因为 XCode 7 仍未修复集合项目原型的 segue 错误。
这是一张截图,我希望它能包含所有重要信息:
这里是单元格的 controller/delagating class 代码的详细信息:
///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()
}
}
不确定是否需要这样做,但为了以防万一这里主要 window 的 ViewController 执行一些 setup/loading 功能。
加载代码本身:
///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 框架的新手,所以它很笨拙。
采取不同的路线:将您的标签绑定到 self.morpheme.morphemeDisplayName。然后将 "Null Placeholder" 文本设置为 "Morpheme"(在右侧面板中,查看绑定设置下方的文本编辑列表)。最后使 属性 morphemeDisplayName 动态:
dynamic var morphemeDisplayName: String?
显然,您不再需要在单元格内使用 morphemeLabel 属性。
cell的词素属性也必须是动态的,或者如果有setter基础的属性,可以调用:
set {
willChangeValueForKey("morpheme")
<whatever variable> = newValue
didChangeValueForKey("morpheme")
}
发帖人编辑:
此外,为了避免绑定同步问题,使用 viewWillAppear()
而不是 viewDidLoad()
导致了数据加载问题和 "freezing the labels".