当前位置: 首页 > 知识库问答 >
问题:

UIImage未保存在Documents目录中并终止应用程序

宗政欣可
2023-03-14

我从UIImagePickerController获取UIIimage,并保存它,如下所示:

- (void) saveImageLocally:(UIImage *)image {
    NSData *imageData = UIImagePNGRepresentation(image);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"A5UserAvatar"]];

    if (![imageData writeToFile:imagePath atomically:NO])
    {
        NSLog(@"Failed to cache image data to disk");
    }
    else
    {
        NSLog(@"the cachedImagedPath is %@", imagePath);
        [[NSUserDefaults standardUserDefaults] setObject:imagePath forKey:@"AvatarKey"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
}

我可以立即访问它,没有问题,如下所示:

- (UIImage *) getLocalImage {
    NSString *path = [[NSUserDefaults standardUserDefaults] stringForKey:@"AvatarKey"];
    NSLog(@"PATH FOR IMAGE IS %@", path);
    if (path != nil) {
        return [UIImage imageWithContentsOfFile:path];
    } else {
        return [UIImage imageNamed:@"default.gif"];
    }
}

上面的代码返回保存的UImage完全没有问题。

事情是,当我杀了应用程序并重新启动它,它的图像没有找到!我目前正在使用Xcode6构建iOS7和8。我知道这个问题在模拟器中是不可避免的,但我也在一个现场设备上体验过。

(见Xcode 6每次运行后都会在iOS8模拟器中不断重命名我的应用程序的目录。)

我想知道我做错了什么,或者是否有另一种方法,只是将任何图像作为文件存储在应用程序中,以便像头像一样使用。

共有1个答案

贡正诚
2023-03-14

问题是您保存的是完整路径,而不是相对于Documents文件夹的路径。您不能保存完整路径,因为应用程序路径可以更改。

你想要这样的东西:

- (void) saveImageLocally:(UIImage *)image {
    NSData *imageData = UIImagePNGRepresentation(image);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *filename = [NSString stringWithFormat:@"%@.png",@"A5UserAvatar"];
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:filename];
    if (![imageData writeToFile:imagePath atomically:NO])
    {
        NSLog(@"Failed to cache image data to disk");
    }
    else
    {
        NSLog(@"the cachedImagedPath is %@", imagePath);
        [[NSUserDefaults standardUserDefaults] setObject:filename forKey:@"AvatarKey"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
}

- (UIImage *) getLocalImage {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *filename = [[NSUserDefaults standardUserDefaults] stringForKey:@"AvatarKey"];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:filename];
    NSLog(@"PATH FOR IMAGE IS %@", path);
    if (path != nil) {
        return [UIImage imageWithContentsOfFile:path];
    } else {
        return [UIImage imageNamed:@"default.gif"];
    }
}
 类似资料:
  • 问题内容: 我想使用gprof来分析守护程序。我的守护程序使用第3方库,通过该库注册一些回调,然后调用一个永不返回的函数。我需要调用(SIGTERM或SIGKILL)终止守护程序。不幸的是,gprof的手册页显示以下内容: 被分析的程序必须调用“ exit”(2)或正常返回,以将分析信息保存在gmon.out文件中。 有没有办法为使用SIGTERM或SIGKILL杀死的进程保存概要分析信息? 问题

  • 问题内容: 我的项目目录结构如下(我认为这很标准): 我将py.test用于我的测试框架,并且希望能够在目录中运行我的测试时运行。在我尝试在测试中使用(例如)导入应用程序代码之前,这确实可行。那时,我收到错误“没有名为mypkg的模块”。经过一些调查,似乎使用测试文件的目录运行而 不是从中运行目录的情况下运行测试。 为了解决此问题,我向目录中添加了一个文件,其中包含以下代码: 这似乎可行,但这是确

  • 我是WebSphere的新手。已经安装了带有单个配置文件的WebSphere8.5服务器。并且安装并启用了JDK7(因为WebSphere8.5默认附带JDK6)。最后,安装了应用程序。但是已安装的应用程序在“已安装的应用程序”目录中没有得到更新。 但是,应用程序安装在C:\websphere85\appserver\profiles\appsrv01中 不知道它在哪里覆盖了这条路径。请帮帮忙。提

  • ...有点。正如这个极其简单的例子所示, 我的一个应用程序很少以这种方式崩溃(到目前为止只报告过一次)。当一个不确定的异常发生时,我想像往常一样终止它。我的策略是(低级)记录问题,然后终止。应用程序是子系统的一部分,如果检测到任何问题,我想(重新)启动它。它是用C -Builder 6构建的,在Windows (XP)上运行...7,也是8)。我了解到< code>abort()很可能导致了这个错

  • 问题内容: 当我上传新文件时,即使我指定了别的,它也会保存到应用程序的根文件夹中。为什么配置不起作用? : 问题答案: 是Flask可以识别的配置选项。相对于当前工作目录(通常是开发过程中的项目根目录)工作。 将安全的文件名加入上载文件夹,然后保存到该路径。 最好将本地数据存储在实例文件夹中,而不是项目根目录中。Flask已经知道那在哪里。只要确保你instance首先创建目录即可。 无论你决定将