在我的应用程序中,我要求用户绘制标志,然后我使用以下代码在UIImageView中显示该图像:
UIGraphicsBeginImageContext(captureView.bounds.size);
[captureView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
[ivStudentSign setImage:viewImage];
UIGraphicsEndImageContext();
NSMutableDictionary *tempDict=[[NSMutableDictionary alloc] init];
[tempDict setObject:UIImagePNGRepresentation(viewImage) forKey:userID];
[arrStoreSigns addObject:tempDict];
[userDef setObject:arrStoreSigns forKey:@"storeSigns"];
它几乎可以正常工作但有时我会
setObjectForKey:object不能为nil
这使我的应用程序崩溃。我做错了什么?我在ios 8.4.1上运行应用程序
答案 0 :(得分:2)
要解决这个问题,你需要后退。
对象为零,这意味着arrStoreSigns
为零。 arrStoreSigns
为零,因为tempDict
为零。由于tempDict
没有给你任何价值,UIImagePNGRepresentation(viewImage)
为零,因此它变为nil
。这可能发生,因为viewImage
由于UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
返回nil
图片而为零。
你放置断点并检查,其中上面的哪一个实际上是失败的。
答案 1 :(得分:0)
答案就在崩溃日志中。 setObjectForKey
方法要求将一个非零的对象设置为NSDictionary
。检查您是否获得UIImagePNGRepresentation(viewImage)
或arrStoreSigns
答案 2 :(得分:0)
在NSMutableDictionary中,不能为密钥设置nil值。它可以是NULL对象。 要确保nil和NULL对象不能插入字典,可以使用以下代码片段来避免崩溃。
if (anObject != [NSNull null] && anObject != nil) {
[self setObject:anObject forKey:aKey];
}
这里anObject可以是你的图像对象,self可以是你的tempDict。
您的代码:
UIGraphicsBeginImageContext(captureView.bounds.size);
[captureView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
[ivStudentSign setImage:viewImage];
UIGraphicsEndImageContext();
NSMutableDictionary *tempDict=[[NSMutableDictionary alloc] init];
if (viewImage != [NSNull null] && viewImage != nil) {
[tempDict setObject:UIImagePNGRepresentation(viewImage) forKey:userID];
[arrStoreSigns addObject:tempDict];
[userDef setObject:arrStoreSigns forKey:@"storeSigns"];
}