Можете ли вы проверить, что ваша бездействующая анимация изменяет свою позицию в любом случае.
Вы используете setValue: forKey:
, который принимает только NSString
s в качестве ключей. вы должны использовать вместо этого setObject: forKey:
. Объект класса (указатели на объекты классов могут передаваться как тип Class
) является полноценным объектом Objective-C (объект класса является экземпляром его мета-класса, и вы можете использовать все Методы NSObject
для объекта класса, подробнее о мета-классах здесь ), поэтому они могут использоваться везде, где используются объекты.
Другим требованием к ключам словаря является то, что они поддерживают копирование (т. Е. Имеют метод copyWithZone:
. Поддерживают ли объекты класса этот метод? Фактически, это так. Класс NSObject определяет метод класса + copyWithZone:
, чья документация явно говорит, что он «позволяет использовать объект класса в качестве ключа к объекту NSDictionary». Я думаю, что это ответ на ваш вопрос.
-setValue: forKey:
задокументировано для получения строки NSString
в качестве второго параметра , Вам нужно будет использовать NSStringFromClass ()
и NSClassFromString ()
в качестве адаптеров.
Я искал setObject: forKey : метод вместо setValue: forKey :. Подпись метода для setObject: forKey: принимает (id) в качестве обоих типов параметров и подходит гораздо лучше.
У меня только что была похожая ситуация с тем же сообщением об ошибке:
[tempDictionary setObject:someDictionary forKey:someClass];
Все, что я сделал, это реализовал протокол NSCopying
в someClass
:
- (id)copyWithZone:(NSZone *)zone
{
id copy = [[[self class] allocWithZone:zone] init];
[copy setId:[self id]];
[copy setTitle:[self title]];
return copy;
}
Я думаю, что происходило то, что была сделана копия someClass
для использования в качестве ключа, но так как мой объект не знал, как копировать себя (производный от NSObject
у него не было copyWithZone
в суперклассе) он отказался.
Одна вещь, которую я нашел с моим подходом, состоит в том, что он использует объект в качестве ключа. Если объект уже не создан, я постоянно вызываю allKeys
или просто перечисляю по словарю иным образом.
[После этого я вижу, что вы хотите сохранить класс как ключ. Я оставляю это там, потому что я бы сэкономил много времени, если бы нашел свой ответ, когда искал SO. Тогда я не нашел ничего подобного.]
Другой вариант - использовать [NSValue valueWithNonrehibitedObject: yourObjectHere]
, чтобы построить ключ не из строки. У меня возникла аналогичная проблема, и я хотел использовать объект CoreData в качестве ключа и что-то еще в качестве значения. Этот метод NSValue
работал идеально, и я считаю, что это было его первоначальное предназначение. Чтобы вернуться к исходному значению, просто вызовите nonrehibitedObjectValue