【问题标题】:How to update single key/value from dictionary in morph?如何从变形的字典中更新单个键/值?
【发布时间】:2015-12-29 08:39:27
【问题描述】:

previous question 中,我询问如何在 GUI 中显示Dictionary 的内容。我从这个想法开始构建一个外观和感觉稍微好一点的 GUI。它主要由在列和行中粘合在一起的RectangleMorphs 组成(参见我上一个问题中接受的答案)。

现在的问题是我希望在我的字典中添加/删除/编辑元素时更新我的​​表格。我设法编写了一些Morph,其中包含CellMorphs 的列,它们继承自RectangleMorph,并将modelmessage 作为实例变量,并带有以下更新消息:

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.

可以看出,CellMorphMorph 的容器,其中包含单元格的实际内容。这非常适合显示字典的大小,例如:

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 显示字典而不创建数十亿我的CellMorphs 或者我应该忘记我的想法而是使用CellMorphs 的行例如以便对字典中的条目进行分组?


为了完整性:CellMorph 中的 model: 消息看起来像:

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.,我还在Dictionary 的所有消息中添加了self changed.,我希望通知接口(@98​​7654343@、removeKey: 等)。

【问题讨论】:

    标签: user-interface observer-pattern smalltalk squeak


    【解决方案1】:

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

    我认为没有使用object perform: message 执行消息,您应该检查一下。 message perform 应该可以工作,因为它已经有了接收器。

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

    关于代码的一些旁注:

    (model = nil or: message = nil) 
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2019-07-15
      • 1970-01-01
      • 2021-02-19
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多