将UIImage从viewcontroller传递到另一个

时间:2014-03-21 09:35:45

标签: ios objective-c cocoa-touch parse-platform

我想将UIImage从View Controller传递到另一个,但它不起作用。如果我在第二个视图控制器中记录UIImage值,我实际得到(null)。

图片文件来自parse.com。它在第一个视图控制器中工作得非常好。但是一旦我将它传递给第二个视图控制器,图像就不会在那里工作。

以下是代码:

我在firstViewController(BookListTableViewController)的.m文件中的prepareForSegue

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"ShowBookDetailSegue"]) {

    NSIndexPath *indexPath = [self.bookListTableView indexPathForSelectedRow];
    ParseBookDetailTableViewController *pbdtvc = segue.destinationViewController;

        PFObject *tempObject = [totalStrings objectAtIndex:indexPath.row];

        PFFile *eventImage = [tempObject objectForKey:@"bookImage"];

        if(eventImage != NULL)
        {

            [eventImage getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error)
             {

                 UIImage *thumbnailImage = [UIImage imageWithData:imageData];


                 pbdtvc.bookImageDetail = thumbnailImage;

             }];

        }

我的.h文件的第二个ViewController(ParseBookDetailViewController)

@property (strong, nonatomic) UIImage* bookImageDetail;
@property (strong, nonatomic) IBOutlet UIImageView *bookImageDetailView;

secondViewController的我的.m文件的viewDidLoad(ParseBookDetailViewController)

NSLog(@"%@",bookImageDetail);
[bookImageDetailView setImage:bookImageDetail];

正如我所说:在原始视图控制器中,图像是正确的。我可以记录它,甚至将它设置为ImageView。但在第二个视图控制器中有(null)。

很高兴寻求帮助,谢谢..

编辑:

这是我的cellForRowAtIndexPath的代码。

PFObject *tempObject = [totalStrings objectAtIndex:indexPath.row];
    //cell.textLabel.text = [tempObject objectForKey:@"bookTitle"];
    cell.titleTextField.text = [tempObject objectForKey:@"bookTitle"];
    cell.bookAutor1Label.text = [tempObject objectForKey:@"bookAutor1"];
    cell.isbnLabel.text = [tempObject objectForKey:@"bookISBN"];

    cell.statusLabel.text = [tempObject objectForKey:@"bookStatus"];
    cell.yearLabel.text = [tempObject objectForKey:@"BookDate"];


    if ([cell.statusLabel.text isEqualToString:@"nicht verfügbar"]) {
        cell.statusLabel.tintColor = [UIColor redColor];
        cell.dotImageIcon.image = [UIImage imageNamed:@"dot_red.png"];

    }else if ([cell.statusLabel.text isEqualToString:@"verfügbar"]){
        cell.statusLabel.tintColor = [UIColor greenColor];
        cell.dotImageIcon.image = [UIImage imageNamed:@"dot_green.png"];
    }

    PFFile *eventImage = [tempObject objectForKey:@"bookImage"];

    if(eventImage != NULL)
    {

        [eventImage getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error)
         {

             UIImage *thumbnailImage = [UIImage imageWithData:imageData];

             prepareForSegueImage = thumbnailImage;

             [cell.bookImageView setImage:thumbnailImage];

         }];

    }

在底部,我在一个新属性(prepareForSegueImage)中设置了Image(可以工作)。现在已加载。

现在我已经尝试将prepareForSegueImage传递给新的视图控制器,但它实际上并没有从单元格传递一个,它传递了整个表视图中加载的最后一个。第一视图控制器。

2 个答案:

答案 0 :(得分:3)

我在猜测:

[eventImage getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error)
{
    UIImage *thumbnailImage = [UIImage imageWithData:imageData];
    pbdtvc.bookImageDetail = thumbnailImage;
}];

是在后台发生的异步请求,需要一些时间才能返回。但是你的代码期待它立即发生。

首先加载图像并在完成块中调用segue,

修改

如果它在第一个viewController中运行(意味着你有图像),为什么还要再次请求它?为什么不简单地传递你已经拥有的图像呢?

编辑2:

正如我的评论中所解释的,每次调用cellForRowAtindexPath时都会覆盖您的变量。您可以将该代码包装在if语句中,检查索引或某个图像等。或者您可以使用以下代码获取特定单元格并拉出图像形式。

[tblView cellForRowAtIndexPath: [NSIndexPath indexPathForRow:2 inSection:0]];

如果您已下载图像并且有相对简单的方法来获取图像,则不应再次下载。这可能会使用户花费3G数据计划以及浪费资源。

答案 1 :(得分:2)

这是因为您正在使用getDataInBackgroundWithBlock,这是一个异步调用。当这种情况发生在后台线程中时,当你转向另一个viewcontroller时它可能没有完成。

你说它在第一个控制器中工作正常。我认为这意味着您已经下载了图像。将它放在属性中,并将此属性发送到下一个控制器。