【问题标题】:UIImage not being saved in Documents directory and killing the appUIImage 未保存在 Documents 目录中并杀死应用程序
【发布时间】:2015-01-07 02:27:08
【问题描述】:

我从 UIImagePickerController 获取 UIImage,然后像这样保存它:

- (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"];
    }
}

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

问题是,当我杀死应用程序并重新启动它时,找不到图像! 我目前正在为 iOS 7 和 8 使用 Xcode 6 构建。我知道这个问题在模拟器中是不可避免的,但我也在现场设备上遇到它。

(见Xcode 6 keeps renaming my app's directory in iOS8 simulator after each run.)

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

【问题讨论】:

    标签: ios uiimage


    【解决方案1】:

    问题在于您保存的是完整路径,而不是相对于 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"];
        }
    }
    

    【讨论】:

    • 上面好像不行,app在加载图片的时候打印了一个路径,但是杀了再运行,打印出不同的路径,当然也找不到文件了.
    • 保存图片时路径为:/var/mobile/Containers/Data/Application/D38345C3-473A-485F-A90C-3890736DDD54/Documents/A5UserAvatar.png它尝试读取的是:/var/mobile/Containers/Data/Application/B5595689-10DA-4BBA-B47E-8E27EDE38AE4/Documents/A5UserAvatar.png
    • 对。当您重建并运行您的应用程序时,它会将应用程序移动到新文件夹。但是内容也应该移动,除非您在构建之间从设备中删除应用程序。
    • 从上次构建运行应用程序,直接从手机运行,无需重新构建。它第一次保存它很好,但是当我杀死它并重新启动它时,我似乎得到了同样的效果。
    • 路径不应该在运行之间改变,除非你做另一个构建并从 Xcode 运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2023-03-23
    • 2018-01-08
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多