我有一个最初是在 Objective-C 中创建的应用程序(我们称之为版本 1),现在我已将我的应用程序转换为 Swift 2.0(版本 2)。该应用程序的主要功能之一是能够将图像和文本从一台设备发送到另一台设备。图像和文本存储在 NSMutableDictionary 中,然后编码为 NSData 并发送/存储在 Parse 后端服务器上。我的应用程序的设计还能够通过电子邮件将图像从一台设备发送到另一台设备。
这适用于我的应用程序的两个版本——Objective C 和 Swift。太棒了!
我的问题是,当用户将 NSData 从我的应用程序版本 1 发送到版本 2 的设备时(基本上是用 Objective-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( objective-c )创建和发送的图像 photoImageView 是空白的(没有错误)但 imageData 很大(打印输出显示 imageDate 确实保存了用户图像)。
Surley 如果 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];
最佳答案
如果您使用 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];
}
关于ios - UIImage 在 ObjectiveC 中编码为 NSData,然后在 Swift 中解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36692907/