我正在嘗試創建一個半複雜的視圖動畫集(想想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