使用imageNamed在设备上失败,但在模拟器中工作

时间:2012-12-01 18:48:58

标签: objective-c ios uiimage

这是我的代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

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

    NSArray *filePathsArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  error:nil];
    NSMutableArray *finalArray = [(NSArray*)filePathsArray mutableCopy];
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *files = [fm contentsOfDirectoryAtPath:documentsDirectory error:nil];
    NSString *fileFirst = [files objectAtIndex:0];
    NSString *fullPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, fileFirst];
    /* NSUInteger index = [finalArray indexOfObject:@".DS_Store"];
    [finalArray removeObjectAtIndex: index]; */
    //NSLog(@"files array %@", finalArray);
    NSString *title = [[[finalArray objectAtIndex:indexPath.row] lastPathComponent]stringByDeletingPathExtension];
    NSString *image = [[finalArray objectAtIndex:indexPath.row] lastPathComponent];
    NSString *newimage = [[image pathExtension]stringByAppendingPathExtension:@"png"];
    //NSLog(@"%@",newimage);

    if (![UIImage imageNamed:newimage]) {
        newimage = @"notFound.png";
    }

    NSDictionary *fileAttribs = [[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:nil];
    ////NSLog(@"Here: %@",fileAttribs);
    //long long fileSize = [fileAttribs fileSize];

    NSDate *result = [fileAttribs valueForKey:NSFileCreationDate]; //or NSFileModificationDate
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init]  autorelease];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    NSString *dateString = [dateFormatter stringFromDate:result];   
    [dateFormatter setDateStyle:NSDateFormatterNoStyle];

    cell.textLabel.text = title;
    cell.imageView.image = [UIImage imageNamed:newimage];
    //cell.detailTextLabel.text = [NSString stringWithFormat:@"File extenstion: %@",[[image pathExtension]uppercaseString]];
    cell.detailTextLabel.text = dateString;
    cell.detailTextLabel.font = [UIFont systemFontOfSize:15];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

如上所示,我在用户Documents文件夹中获取文件的扩展名,并找到具有该扩展名的图像。这是有效的 - 当我NSLog字符串时,我得到正确的图像(例如PDF.png)但是,如果找不到图像,我希望newimage变量为notFound.png。

这适用于模拟器,但在我在设备上测试时却无效。在设备上,所有cell.imageView.image都显示为notFound.png,即使单元格为NSLogs PDF.png(例如)。任何人对问题是什么都有任何想法?感谢。

2 个答案:

答案 0 :(得分:6)

Mac OS X(以及您的模拟器)使用的文件系统通常配置为而不是以区分大小写(它在您创建文件名时保留了大小写,但如果您使用错误的大写)。但该设备区分大小写。

如果您发现平台之间通过imageNamed(或从本地文件系统读取文件的任何内容)查找文件有所不同,请检查您的大小写。


如果你仍然没有找到它,我会建议确保文件显示在目标的“构建阶段”中,并检查“复制捆绑资源”部分,并为基本文件名和延期。我还要确保你做一个“产品” - “清理”并重建应用程序,因为有时Xcode会对已复制的文件感到困惑。我还假设您已退出并重新启动Xcode,因为当我看到这种罕见的,完全无法解释的行为时,重新启动Xcode(有时甚至是我的机器)将会解决它。

答案 1 :(得分:1)

pdf似乎不在你的包中。 imageNamed似乎是方法的错误选择

调用imageWithContentsOfFile但仅针对未发现的图像调用imageNamed

编辑:立即将newimage变量设为图像

e.g。

id newimagepath = [[image pathExtension]stringByAppendingPathExtension:@"png"];
UIImage *newimage = [UIImage imageWithContentsOfFile:newimagepath];

if(!newimage) {
    newimage = [UIImage imageNamed:@"notFound.ong"]
}