UIImageView在模拟器上显示图像,但在iPhone上不显示

时间:2013-05-18 00:09:49

标签: objective-c uiimageview uiimage ios-simulator

我的UIImageView之一得到了一个非常奇怪的错误。我有UITableView列出项目,每个单元格都是一个项目。每个项目单元格都有缩略图图像,标题和副标题。我能够在模拟器和iPhone上完美地显示每个单元格中的缩略图。

我还有一个详细的VC,当某个单元格被点击时,它会转向该VC并显示大图像,以及有关该项目的更多信息。我已经能够在模拟器中加载图像,但在iPhone上,我得到的只是一个空白UIImageView

这就是它在模拟器中的样子。

Table View

我的细节VC:

Detail VC

底部的蓝色视图是我将添加标签以显示有关该项目的更多详细信息的位置,而橙色是UIImageView,它将显示一个自定义图像,只是说“项目详细信息”。一个人可以点击那个,或者我的大UImageView,它会动画起来(并向下解雇)。

现在,问题是 - 当我从我的表VC转到我的详细VC时,UIImageView在iPhone上只是空白。它在模拟器上工作得很好,所以我传递了正确的图像等。

以下是segue的代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showItemDetails"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        ItemDetailViewController *itemDetailVC = segue.destinationViewController;
        Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
        if(item)
        {
            itemDetailVC.pictureImage = [UIImage imageWithContentsOfFile:item.photoURL];
        }
    }
}

我的项目使用Core Data保存。 photoURL是我的应用的文档目录中的照片的网址,因为我没有将整个图像保存到Core Data,只是出于性能目的而引用它。

以下是在“展开”segue中从另一个VC获取数据的代码的一部分。

- (IBAction)saveItem:(UIStoryboardSegue *)segue
{
    ManageItemViewController *manageItemVC = (ManageItemViewController *)segue.sourceViewController;

    NSMutableDictionary *itemInfo = [[NSMutableDictionary alloc] init];

    ...

    // write the original photo to a file and keep an URL to it that we pass to Core Data
    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(manageItemVC.pictureImage)];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
    NSString *fileName = [NSString stringWithFormat:@"%lf.png", [[NSDate date] timeIntervalSince1970]];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName]; //Add the file name
    [imageData writeToFile:filePath atomically:YES]; //Write the file

    [itemInfo setObject:filePath forKey:CD_ITEM_PHOTOURL_PROPERTY];

    ...

    [self saveItemToCoreData:[itemInfo copy]];
}

在我的详细信息VC中,这就是我要加载UIImage我发送到大UIImageView的所有内容。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if(self.pictureImage) {
        [self.pictureImageView setImage:self.pictureImage];
    }
} 

当用户删除一个项目(删除行​​)时,我也会从我的文档目录中删除该文件,因此(此代码在我的表VC中):

- (void)deleteItemImageFromDevice:(NSString *)filePath
{
    if(filePath)
    {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSError *error;
        if([fileManager removeItemAtPath:filePath error:&error]) {
            NSLog(@"Image deleted from documents directory!");
        } else {
            NSLog(@"%@", error);
        }
    }
}

我记录了这个,我在模拟器中没有出现任何错误。

任何人都知道这里的问题是什么?感谢。

1 个答案:

答案 0 :(得分:1)

我已成功解决了这个问题。

以下是我对代码所做的修复。

我现在使用NSProcessInfo得到一个保证唯一的字符串(不需要长浮点转换),而不是时间间隔,如下所示:

NSString *fileName = [NSString stringWithFormat:@"%@.png", [[NSProcessInfo processInfo] globallyUniqueString]];

然后,在我的prepareForSegue:方法中,我从文档文件夹(文件)中存在的数据中获取UIImageitem.photoURL是我们的文件路径。

Item *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
        if(item.photoURL)
        {
            itemDetailVC.pictureImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:item.photoURL]];
        }

最后,在我们的详细VC头文件中,我们的UIImage(不是UIImageView!)需要strong引用,而不是weak引用,因为我们需要甚至在VC在屏幕上之前访问它:

@property (nonatomic, strong) UIImage *pictureImage;

我们将此UIImageView分配给UIImage可以是weak,因为只有当视图在屏幕上时才需要显示strong,并且它包含strong指针它的所有子视图。对于weak与{{1}},check this的完美类比。