簡體   English   中英

將UIImage從ViewController傳遞到另一個

[英]Passing a UIImage from a viewcontroller to another

我想將一個UIImage從一個View Controller傳遞給另一個,但它不起作用。 如果我在第二個View Controller中記錄UIImage值,我實際上會得到(null)。

圖像文件來自parse.com。 而且它在第一個視圖控制器中絕對可以正常工作。 但是,一旦我將其傳遞給第二個視圖控制器,該圖像將無法在那里工作。

這是代碼:

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

- (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;

             }];

        }

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

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

第二個ViewController(ParseBookDetailViewController)的.m文件的viewDidLoad

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

正如我所說:在原始View Controller中,圖像是正確的。 我可以記錄它,甚至將其設置為ImageView。 但是在第二個視圖控制器中有(空)。

很高興獲得幫助,謝謝..

編輯:

這是我的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傳遞給新的視圖控制器,但實際上並沒有傳遞該單元格中的那個,而是傳遞了第一個視圖控制器中加載到整個表視圖中的最后一個。

我正在猜測:

[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數據計划的費用,也浪費資源。

發生這種情況是因為您正在使用getDataInBackgroundWithBlock,這是一個異步調用。 由於這是在后台線程中發生的,因此當您選擇另一個視圖控制器時,它可能尚未完成。

您說它在第一個控制器中工作正常。 我認為這意味着您已經下載了圖像。 而是將其放在屬性中,然后將此屬性發送到下一個控制器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM