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

最初の質問についてはわかりませんが、2番目の質問「任意のスレッドからUIオブジェクト(InvokeOnMainThreadを呼び出す)を取得するにはどうすればよいですか?」についてはどうでしょうか。

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