使用新的UIImage更新UIImageView

时间:2013-01-19 17:18:09

标签: ios mono xamarin.ios

* 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;
}

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

2 个答案:

答案 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的背景颜色设置为其他内容来尝试是否存在视图。