我正在尝试创建一个半复杂的视图动画集(想想NSMatrix
表单的动画版本,其中行随着其他行的添加或删除而滑动),并构建我制作的动画助手类。使用NSView实例作为NSDictionary键?
在那里,我必须跟踪不同的视图,它们的有序索引以及与它们的动画相关的一些其他值。
为此,我使用NSArray
实例来跟踪视图的排序(索引),并且我想使用带有视图的NSDictionary
作为键来跟踪值(值本身在嵌套字典中)。即我希望能够做到这事,例如(伪代码):
NSMutableDictionary* viewValuesDict = [NSDictionary dictionary];
// Loop thru an ordered NSArray
for((NSView*) view in viewsArray) {
// Get some values we'll need later
NSDictionary* associatedValues = [view getSomeValues];
// ...and put them into viewValuesDict...
[viewValuesDict setObject:associatedValues forKey:view];
// and then things break because the NSView 'view'
// doesn't support copyWithZone.... darn
}
问题是,我当然不能用NSView
实例作为字典键,因为键使用添加的copyWithZone
,其中NSView
未执行。
那么,什么是获得NSView
实例的唯一密钥的好方法?我可以想象使用[obj description]
,因为你获得的内存地址是一个完美的UID,但是当然系统必须与任何类型的NSView
子类一起工作,这可能会完全返回其他东西,所以这没有用。
或者我应该尝试一些其他的东西?有没有可能替代NSDictionary
,钥匙只是不复制?因为在这种情况下,我真的不需要复制密钥。
谢谢。是的,我也在想这个。我只是想到,只有使用任何ol对象作为关键的方法。看起来(至少对我来说)使用对象作为键将是一个简单的方法来“伪造”对象上的一些额外属性(我希望类别会以某种方式让你添加ivars ......叹息)。 – Flambino 2010-12-05 21:39:59
不是。键具有真正特定的属性;这正是使字典有效的原因。如果你真的想为每个NSView添加一些额外的属性,为什么不是继承?这正是子类的用途! – andyvn22 2010-12-06 03:41:06
因为代码必须在任何视图上运行,而不仅仅是特定的子类。此外,它只是在很短的时间内存储一些相关的值(足够长的时间来准备生成的NSViewAnimation,但就是这样),所以虽然我可以做一些对象组合并包装NSViews,但它看起来像是矫枉过正。无论如何,NSMapTable工作出色:-) – Flambino 2010-12-06 09:44:14