从路径获取UIImage只能在调试器中单步执行

时间:2015-01-17 19:50:03

标签: ios objective-c iphone debugging uiimage

在我的应用程序中,我将图像保存到设备“文档”文件,然后将其检索以用作按钮背景。我在两个不同的设备上测试了这个,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/UserIcon‌​s/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]; 

1 个答案:

答案 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 目录存在方面做了什么。