簡體   English   中英

使用新的UIImage更新UIImageView

[英]Update UIImageView with new UIImage

*更新***

我的第一個描述(現已刪除)並非真實情況。 它是問題的簡化版本。

完整情況:

我想用UIImageView中的UIImage來改變我從iphone照片庫中選擇的圖片。 為此,我使用了MediaPicker(Xamarin庫的一部分)。

單擊按鈕時,將創建Mediapicker。 然后我調用一個函數從照片庫中拍照。 這個方法需要2個參數。 Mediapicker和回調函數。 - > PictureFromGallery(mediaPicker,CallbackPhotoMade); 用戶選擇要上傳的照片庫中的圖片后,將觸發此回調函數。

在這個回調函數中,我想更改UIImageView的UIImage。

void CallbackPhotoMade(MediaFile obj)
{
    imageviewPhoto1.Image = UIImage.FromFile("Images/image2.PNG");
    //To test I just use a file from a folder in my project
}

當我斷開上面的函數(CallbackPhotoMade)並將鼠標放在文本“.Image =”時,以下消息顯示: MonoTouch.UIKit.UIKitThreadAccessException:UIKit一致性錯誤:您正在調用只能從中調用的UIKit方法UI線程

我認為這就是為什么UIImageView中的UIImage不會改變的問題。

有誰知道如何解決這個問題?

* UPDATE2 ***我在另一個主題中讀到這可以通過將CheckForIllegalCrossThreadCalls設置為false來解決,例如:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    UIApplication.CheckForIllegalCrossThreadCalls = false;
}

不幸的是,圖像仍然沒有改變。 雖然,具體錯誤消失了。

試試這個:

void CallbackPhotoMade(MediaFile obj)
{
    InvokeOnMainThread(() => { 
        imageviewPhoto1.Image = UIImage.FromFile("Images/image2.PNG"); 
    });
    //To test I just use a file from a folder in my project
}

您所做的設置,只是禁用檢查,但不會阻止異常。

回調是在另一個線程(異步)上完成的。 您可以/應該只更新主線程上的用戶界面 InvokeOnMainThread()使您的代碼在主線程上執行,這正是您所需要的。

理想情況下,代碼應該運行。 在changeImage方法中檢查imageviewPhoto1是否為nill。 如果是,那么您的對象可能已被釋放。

如果不是nill然后嘗試寫[self.view setNeedsDisplay]; 設置圖像后,只是看重繪視圖可以更新或不更新。 或者通過將imageviewPhoto1的背景顏色設置為其他內容來嘗試是否存在視圖。

暫無
暫無

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

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