如何在变形中更新字典中的单个键/值?

时间:2015-12-29 08:39:27

标签: user-interface observer-pattern smalltalk squeak

previous question中,我问我如何在GUI中显示Dictionary的内容。我从这个想法开始构建一个具有更好外观和感觉的GUI。它主要由RectangleMorph个在列和行中粘合在一起组成(参见我之前提出的问题中的答案)。

现在的问题是,当我在字典中添加/删除/编辑元素时,我希望更新我的表格。我设法编写了一些由Morph列组成的CellMorph RectangleMorph,这些列继承自model并且messageupdate " update the contents of this cell " | value | self removeAllMorphs. (model = nil or: message = nil) ifTrue: [ value := '' ] ifFalse: [ value := model perform: message ]. self addMorph: value asMorph. 作为实例变量,具有以下更新消息:

CellMorph

可以看出,Morph是包含单元格实际内容的d := Dictionary new. d at: 'foo' put: 100. d at: 'bar' put: 200. cell := CellMorph new model: d; message: #size; color: Color white. cell openInWorld. d at: 'boo' put: 300. " cell will be updated " 的容器。这非常适合显示字典的大小:

Morph

但我似乎没有为字典的内容找到类似的东西,因为我找不到通过消息访问单个键或值的方法。我能想到的唯一解决方案是每次创建带有新单元格的新列,但这是如此昂贵,我无法想象这是一个好主意...

因此我的问题
有没有办法更新我的CellMorph显示字典而不创建数十亿的CellMorph,或者我应该忘记我的想法,而是使用model:行的行,以便对词典中的条目进行分组?

为了完整性:CellMorph中的model: newModel "change the model behind this cell" model ifNotNil: [ model removeDependent: self ]. newModel ifNotNil: [newModel addDependent: self]. model := newModel. self update. 消息如下:

update: aParameter

update.只会调用self changed.,我还在Dictionary的所有邮件中添加了at: put:,我希望通知接口({{1} },removeKey:等。)。

1 个答案:

答案 0 :(得分:1)

在名为' message'的实例变量中你可以有一个Message对象,而不是只有选择器。 Message的实例具有接收者,选择器和参数。因此,您可以使用接收器中的dictionary keys sorted asArray,选择器#at:和索引来配置它以获取特定密钥。访问该值将获取值:字典中的该键。

我认为不会使用object perform: message执行消息,您应该检查。 message perform应该有效,因为它已有接收器。

在任何情况下,这种复杂性可能表明只有(一个)模型和(一个)消息不足以以您想要的粒度获得模型,并且您可以使用以下知识进行更多的专业化。 model是一本字典。例如,拥有key或keyIndex的实例变量。

关于代码的一些附注:

(model = nil or: message = nil) 

与nil进行比较,可以用#isNil消息替换,或者,如果你想坚持使用相等,使用更快的==来比较身份,因为nil是唯一的。

#or:用于获得部分评估的好处(仅当接收者为假时才评估参数)。但是只有当你有一个块作为参数时才有效,否则表达式会在之前被计算,以获得堆栈中消息的参数。