的 的 * UPDATE ***
我的第一个描述(现已删除)并非真实情况。这是问题的简化版本。
完整情况:
我想用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一致性错误:您正在调用只能从UI线程调用的UIKit方法
我认为这就是为什么UIImageView中的UIImage不会改变的问题。
有谁知道如何解决这个问题?
的 的 * UPDATE2 *** 我在另一个主题中读到这可以通过将CheckForIllegalCrossThreadCalls设置为false来解决,如:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
UIApplication.CheckForIllegalCrossThreadCalls = false;
}
不幸的是,图像仍然没有改变。 虽然,具体的错误消失了。
答案 0 :(得分:4)
试试这个:
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()
使您的代码在主线程上执行,这正是您所需要的。
答案 1 :(得分:0)
理想情况下,代码应该运行。 在changeImage方法中检查imageviewPhoto1是否为nill。 如果是,那么你的对象可能会被释放。
如果不是nill则尝试写[self.view setNeedsDisplay];设置图像后,只是看重绘视图可以更新或不更新。或者通过将imageviewPhoto1的背景颜色设置为其他内容来尝试是否存在视图。