iPhone - пользовательские настройки по умолчанию и UIImages - PullRequest
2 голосов
/ 13 апреля 2010

Последние несколько месяцев я разрабатывал приложение для iPhone. Недавно я хотел повысить производительность и кэшировать несколько изображений, которые используются в пользовательском интерфейсе. Изображения загружаются пользователем из Интернета случайным образом, поэтому я не могу добавить определенные изображения в проект. Я также уже использую NSUserDefaults для сохранения другой информации в приложении.

Так что теперь я пытаюсь сохранить словарь UIImages в мой объект NSUserDefaults и получить ...

- [UIImage encodeWithCoder:]: нераспознанный селектор отправлен в экземпляр

Затем я решил создать подкласс UIImage с классом UISaveableImage и реализовать NSCoding. Так что теперь я в ...

@implementation UISaveableImage

-(void)encodeWithCoder:(NSCoder *)encoder
{
   [encoder encodeObject:super forKey:@"image"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    if (self=[super init]){
        super =  [decoder decodeObjectForKey:@"image"];
    }
    return self;
}

@end

, что не лучше, чем то, с чего я начал. Если бы мне удалось преобразовать UIImage в NSData, я был бы хорош, но все, что я могу найти, - это функция, подобная UIImagePNGRepresentation, которая требует, чтобы я знал, какой это был тип изображения. То, что UIImage не позволяет мне делать. Мысли? Я чувствую, что, возможно, сбился с неверного пути ...

Ответы [ 2 ]

6 голосов
/ 13 апреля 2010

Вы не хотите хранить изображения в NSUserDefaults. Это большие данные, и NSUserDefaults хранится в виде списка; Вы хотите написать небольшие биты информации к нему.

Вы должны записать изображения на диск, а затем сохранить имена файлов по умолчанию:

NSString   *filename = myImageFilename;
[UIImagePNGRepresentation(image) writeToFile: myImageFilename atomically];
[[NSUserDefaults standardDefaults] setObject: myImageFilename forKey: @"lastImageFilename"]; 
1 голос
/ 07 июля 2011

Спотыкаться об этом год спустя. Я хотел бы добавить (в случае, если кто-то еще споткнется здесь), что вы должны хранить изображения в каталоге кэша и избегать попыток iTunes их скопировать.

- (NSString *)pathForSearchPath:(NSSearchPathDirectory)searchPath {
  NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPath, NSUserDomainMask, YES);
  NSString *directoryPath = [paths objectAtIndex:0];
  return directoryPath;
}

- (NSString *)cacheDirectoryPath {
  return [self pathForSearchPath:NSCachesDirectory];
}
...