在previous question中,我问我如何在GUI中显示Dictionary
的内容。我从这个想法开始构建一个具有更好外观和感觉的GUI。它主要由RectangleMorph
个在列和行中粘合在一起组成(参见我之前提出的问题中的答案)。
现在的问题是,当我在字典中添加/删除/编辑元素时,我希望更新我的表格。我设法编写了一些由Morph
列组成的CellMorph
RectangleMorph
,这些列继承自model
并且message
和update
" 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:
等。)。
答案 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:
用于获得部分评估的好处(仅当接收者为假时才评估参数)。但是只有当你有一个块作为参数时才有效,否则表达式会在之前被计算,以获得堆栈中消息的参数。