Изображения основных данных с рабочего стола на iPhone
-
20-09-2019 - |
Вопрос
Я создал простой инструмент ввода данных для Mac, который использую с приложением для iPhone.Недавно я добавил миниатюру, которую добавил через Image Well, используя простые привязки.Это трансформируемый тип данных, который, похоже, работает нормально.
Однако приложение для iPhone не отображает изображения.Атрибут не равен нулю, но я не могу получить изображение.Ниже приведено значение cellForRowAtIndexPath.
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSManagedObject *entity = nil;
if ([self.searchDisplayController isActive])
entity = [[self filteredListContent] objectAtIndex:[indexPath row]];
else
entity = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [entity valueForKey:@"name"];
//cell.imageview.image = [UIImage imageNamed:@"ImageB.jpeg"]; //works fine
cell.imageView.image = [entity valueForKey:@"thumbnail"];//no error, but no file
return cell;
Я думаю, что проблема либо в трансформируемом объекте (я использую NSKeyedUnarchiveFromData по умолчанию), либо в том, как я вызываю миниатюру.Я новичок, поэтому буду очень признателен за любую помощь.
Решение
Похоже, вы сохраняете изображение как NSImage на рабочем столе, а этот объект не существует на iPhone.Ваше настольное приложение должно хранить изображение в переносном формате, PNG или JPG и т. д.Затем вы сможете загрузить его обратно в приложение iPhone как UIImage.
Обновление трансформируемое
Похоже, вы все еще передаете NSImage в атрибут, и он думает, что вы обрабатываете его данные.Сначала вам необходимо преобразовать его в «стандартный» формат, например:
NSBitmapImageRep *bits = [[myImage representations] objectAtIndex: 0];
NSData *data = [bits representationUsingType:NSPNGFileType properties:nil];
[myManagedObject setImage:data];
Я рекомендую написать специальные методы доступа для решения этой проблемы, например:
#ifdef IPHONEOS_DEPLOYMENT_TARGET
- (void)setImage:(UIImage*)image
{
[self willChangeValueForKey:@"image"];
NSData *data = UIImagePNGRepresentation(image);
[myManagedObject setImage:data];
[self setPrimitiveValue:data forKey:@"image"];
[self didChangeValueForKey:@"image"];
}
- (UIImage*)image
{
[self willAccessValueForKey:@"image"];
UIImage *image = [UIImage imageWithData:[self primitiveValueForKey:@"image"];
[self didAccessValueForKey:@"image"];
return image;
}
#else
- (void)setImage:(NSImage*)image
{
[self willChangeValueForKey:@"image"];
NSBitmapImageRep *bits = [[image representations] objectAtIndex: 0];
NSData *data = [bits representationUsingType:NSPNGFileType properties:nil];
[myManagedObject setImage:data];
[self setPrimitiveValue:data forKey:@"image"];
[self didChangeValueForKey:@"image"];
}
- (NSImage*)image
{
[self willAccessValueForKey:@"image"];
NSImage *image = [[NSImage alloc] initWithData:[self primitiveValueForKey:@"image"]];
[self didAccessValueForKey:@"image"];
return [image autorelease];
}
#endif
Это даст вам условную компиляцию и сохранит данные как NSData (в формате PNG), которые можно будет получить на любом устройстве.