3

问题是:如何在UIScreen.MainScreen.Bounds没有 UI 线程的情况下在 iOS MonoTouch(如)中获得屏幕分辨率?属性.MainScreen抛出异常

UIKit Consistency error: you are calling a UIKit method that can only be invoked from the UI thread.

因此我需要一个 UI 线程。但由于在加载应用程序之前需要解析,因此在UIApplication.Main()调用之前UIApplication.mainThread(一个私有成员,由调试器显示)是null. 我假设根本没有 UI 线程,因为没有 UI。所以我在技术上不能调用InvokeOnMainThread任何对象。

没有其他方法可以获得屏幕分辨率UIScreen.MainScreen吗?如果没有,我将不得不将初始化移至从 UI 调用的一些代码。然后还有另一个问题:如何InvokeOnMainThread从任意线程获取任何 UI 对象(调用)?我无法控制 UI 代码。

4

2 回答 2

3

UI 线程检查是可选的,可以全局或本地禁用。后一个(本地)选项似乎适合您的需要。

以下代码将关闭检查,获取边界并重新启用检查(如果之前已启用)。

bool check_ui = UIApplication.CheckForIllegalCrossThreadCalls;
UIApplication.CheckForIllegalCrossThreadCall = false;
var screen_bounds = UIScreen.MainScreen.Bounds;
UIApplication.CheckForIllegalCrossThreadCalls = check_ui;
于 2013-03-27T15:45:26.267 回答
1

我不知道第一个问题,但是对于第二个问题“如何从任意线程获取任何 UI 对象(调用 InvokeOnMainThread)?”,这个怎么样?

new NSObject().InvokeOnMainThread(() => {   
    //call UI specific stuff
});
于 2013-03-27T15:31:43.513 回答