1

*更新***

我的第一个描述(现已删除)不是真实情况。这是问题的简化版本。

完整情况:

我想用从 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 一致性错误:您正在调用只能从以下位置调用的 UIKit 方法UI线程

我认为这就是为什么 UIImageView 中的 UIImage 不会改变的问题。

有谁知道如何解决这个问题?

*UPDATE2*** 我在另一个主题中读到,这可以通过将 CheckForIllegalCrossThreadCalls 设置为 false 来解决,例如:

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

不幸的是,图像仍然没有改变。虽然,具体的错误消失了。

4

2 回答 2

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()使您的代码在主线程上执行,这正是您所需要的。

于 2013-01-19T19:11:27.923 回答
0

理想情况下,代码应该运行。在 changeImage 方法中检查 imageviewPhoto1 是否为空。如果为 nill,那么您的对象可能已被释放。

如果不是 nill,那么尝试编写 [self.view setNeedsDisplay]; 设置图像后,只看重绘视图是否可以更新。或者通过将 imageviewPhoto1 的背景颜色设置为其他颜色来尝试是否存在视图。

于 2013-01-19T17:38:26.850 回答