ios - 使用新的UIImage更新UIImageView

标签 ios mono xamarin.ios

* 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/

相关文章:

ios - 移动 map 时 MGLCalloutView 掉落 (Mapbox iOS)

.net - 在哪里可以找到 .NET Framework 的单元测试?

c# - MONO 4.6.2 服务器 CPU 使用率高

xamarin.ios - 自定义 Monotouch.Dialog 元素中的中心单元格内容

ios - 如何在 View 加载时设置 UITableView 的滚动位置?

ios - UISegmentedControl 和 NSString

ios - 如何以编程方式使我的应用静音(禁用声音)

ios - Visual Studio 2017 for Mac - iOS 模拟器启动但不运行应用程序

ios - Swift - 以触觉、流畅的方式为按钮设置动画的最佳方式?向下滑动菜单按钮?

c# - 单声道.rsp文件