在我的应用程序中,我将图像保存到设备“文档”文件,然后将其检索以用作按钮背景。我在两个不同的设备上测试了这个,iOS 8上的iPhone 5和iOS 7上的iPhone 4. iPhone 5工作正常,但我对iPhone 4有一个非常奇怪的问题。
使用以下代码设置UIImage“imageToUse”仅在调试中单步执行时才有效。如果我在此代码块之前和之后放置断点,则图像将为零。如果我改为通过它,图像设置正确。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
pathToSave = [paths objectAtIndex:0];
path = [pathToSave stringByAppendingPathComponent: [NSString stringWithFormat:@"UserIcons/%@", customIcon[i]]]; //customIcon[i] contains "userIcon0.jpg"
imageToUse = [UIImage imageWithContentsOfFile:path];
// path contains "/var/mobile/Applications/7E6B8FFA-B56A-48EF-A788-CDB3842F8BB7/Documents/UserIcons/userIcon0.jpg"
这是一个我从未遇到的奇怪问题。任何想法可能是什么原因?谢谢大家。
更新:这是我的保存方法和文件夹检查/创建,如matt。
所要求的 __block bool exit = NO;
__block int count = 0;
while (!exit) {
// updated with matt's advice
NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
Path = [NSString stringWithFormat:@"%@/UserSlides/userSlide%i.jpg", docs, count];
// check to see if file already exists at the path
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:Path];
// if the path is available, write to disk and then exit
if (!fileExists) {
[UIImageJPEGRepresentation(globe.customSlideImage, 1.0) writeToFile:Path atomically:NO];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:Path];
if (fileExists) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Save Complete"
message:nil
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
exit = YES;
}
}
else { // otherwise increment the path file name and retry
count++;
}
}
//////////////
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
dataPath = [[paths lastObject] stringByAppendingPathComponent:@"/UserIcons"];
if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
[[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:nil];
答案 0 :(得分:3)
所以我们有这两行:实际上:
imageToUse = [UIImage imageNamed:path];
imageToUse = [UIImage imageWithContentsOfFile:path];
现在,问题在于我不希望这两个工作,永远。这是因为他们期待非常不同的事情。
imageNamed:
想要一个简单的名称,例如"myFile.jpg"
。它会在您的应用包中找到文件,而不是其他地方。
imageWithContentsOfFile:
想要一个真正的路径名。
如果该文件位于您的应用包中,则只能通过调用NSBundle.mainBundle()
和pathForResource:ofType:
(或类似)来推导此路径。
如果文件在其他地方,则需要使用NSFileManager获取包含文件夹并从那里向下钻取。
现在,您在问题中说你正试图从Documents文件夹中获取文件。好吧,imageNamed:
永远不会从那里获取文件。我的猜测是,也许一个错误允许你以这种方式获取文件,但这不是你应该依赖的东西。因此,您的第一步应该是完全取消该调用并专注于imageWithContentsOfFile:
,这可以满足您的需求。
编辑:
Path = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/UserSlides/userSlide%i.jpg", count]];
哇。这是不获取Documents目录的方式。因此,第一步是正确使用这些目录。要获取文档目录:
NSFileManager* fm = [NSFileManager new];
NSError* err = nil;
NSURL* docsurl =
[fm URLForDirectory:NSDocumentDirectory
inDomain:NSUserDomainMask appropriateForURL:nil
create:YES error:&err];
或者,如果你想要一个路径字符串:
NSString* docs = [NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
此外,我还没有看到您的代码在确保中间 UserSlides 目录存在方面做了什么。