* UPDATE ***
我的第一个描述(现已删除)不是真实情况。它是问题的简化版本。
完整情况:
我想使用从iphone照片库中选择的图片更改UIImageView中的UIImage。
为此,我使用了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一致性错误:您正在调用只能从UI线程调用的UIKit方法
我认为这就是为什么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()
使您的代码在主线程上执行,这正是您所需要的。
关于ios - 使用新的UIImage更新UIImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416793/