UIImage在ObjectiveC中编码为NSData,然后在Swift

时间:2016-04-18 11:38:06

标签: ios objective-c swift uiimage nsdata

我有一个最初在目标C中创建的应用程序(让我们调用此版本1),我现在已经将我的应用程序转换为Swift 2.0(版本2)。该应用程序的主要功能之一是能够将图像和文本从一个设备发送到另一个设备。图像和文本存储在NSMutableDictionary中,然后编码为NSData,并在Parse后端服务器上发送/存储。我的应用程序的设计还能够将图像从一个设备发送到另一个设备。

这适用于我的应用程序的两个版本 - Objective C和Swift。太棒了!

我的问题是当用户从我的应用程序的版本1向具有版本2的设备发送NSData时(基本上是在目标C中编码然后在Swift中解码的图像)!编码文本解码很好但不是图像(保存为objectForKey(“data”))。见下面的例子。 quizData是一个数组,它保存从另一个设备发送的字典(keyValue项)。此数组适用于除objectForKey(“data”)之外的所有项目。该对象是编码图像。

 var imageData = NSData()

imageData = quizData.objectAtIndex(currentQuestionNumber).objectForKey("data") as! NSData

  // the following always prints out lots of info to confirm the imageData has the encoded image
  print("imageData.length = \(imageData.length)")
  print("imageData.description = \(imageData.description)")

   // decoding
  photoImageView.image = UIImage(data:imageData)

好的,所以当使用Swift在另一台设备上创建图像时,上述工作正常。但是,如果从版本1(目标c)创建和发送的图像是photoImageView是空白的(没有错误),那么imageData很大(打印输出显示imageDate确实保存用户图像)。

如果NSdata对象具有UIImage的数据,它应该可以在ObjC或Swift中解码吗?如果需要,发送更多代码没问题

问题修正如下: 不确定这是否真的有帮助,但是通过电子邮件发送NSData的objC代码(所有应用程序数据都保存为pList)

// emailArray to be populated with selected data from plist
NSMutableArray *emailArray = [NSMutableArray arrayWithContentsOfFile:path];

 MFMailComposeViewController *emailPicker = [[MFMailComposeViewController alloc]init];
 emailPicker.mailComposeDelegate =self;


/// NSdata from emailArray
NSData *emailQuizData = [NSKeyedArchiver  archivedDataWithRootObject:emailArray];
[emailPicker addAttachmentData:emailQuizData mimeType:@"application/quizApp" fileName:_quizNameLabel.text];

1 个答案:

答案 0 :(得分:8)

如果您使用base64编码,则不应出现此问题。

这是swift中的实现:

import UIKit

func base64StringForImage(image: UIImage) -> String? {
    guard let data = UIImagePNGRepresentation(image) else { return nil }
    return data.base64EncodedStringWithOptions([])
}

func imageFromBase64String(string: String) -> UIImage? {
    guard let data = NSData(base64EncodedString: string, options: []) else { return nil }
    return UIImage(data: data)
}

这是objc中的实现:

#import <UIKit/UIKit.h>

NS_INLINE NSString * base64StringForImage_objc(UIImage *image) {
    NSData *imageData = UIImagePNGRepresentation(image);
    return [imageData base64EncodedStringWithOptions:0];
}

NS_INLINE UIImage * imageFromBase64String_objc(NSString *string) {
    NSData *imageData = [[NSData alloc] initWithBase64EncodedString: string options: 0];
    return [[UIImage alloc] initWithData:imageData];
}