2

MonoTouchは、iOSバージョン間でメソッドの可用性をチェックするためのRespondsToSelectorメソッドを公開します。

ただし、クラスの可用性について同様のチェックを実行する方法がわからないようです。
Appleは、iOS 4.2以降では、必要なクラスの静的classセレクターにアクセスする必要があることをここに文書化しています。例えば:

if ([EKReminder class]) 
{
    ....
}

しかし、それは明らかにされていないようです。これをMTに実装するには、すべてのMTタイプに静的プロパティを明示的にマッピングする必要があるという点で、これは前の質問と似ていると思います。Class

だから私の質問は、iOS4.2以前の古いテクニックを使うべきかということだと思います。すなわち:

Class cls = NSClassFromString (@"EKReminder");
if (cls) 
{
    ...
}

私が思うに、これは次のようにマッピングされます。

var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
    ...

または、メッセージングで使用可能な相互運用メソッドを使用してセレクターを手動で呼び出しますか?

または私が見つけていない他のアプローチ?

4

2 に答える 2

5

安全なチェックは以下を使用しています:

if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) {
    // we know we can use EKReminder
}

ただし、リフレクションが含まれるため、少しコストがかかります。Objective-Cの名前は.NETの名前とは異なる場合があります(たとえば、NSURL属性NSUrlを反映することによってのみ見つけることができRegisterます)。

Objective-Cの名前がわかっている場合は、タイプセーフではないオーバーロードを使用して、リフレクションをスキップできます。例えば

// checking for NSUrl would not work
if (Class.GetHandle ("NSURL") != IntPtr.Zero) {
    // we know we can use NSUrl
}

繰り返しになりますが(そして私の答えをすべての人に一般化するために)、iOSバージョンを使用してハードウェア以外の機能のランタイムチェックを行う方が、多くの場合、最良/簡単/高速です。

if (UIDevice.CurrentDevice.CheckSystemVersion (5,0)) {
    // we know feature X was added in 5.0
}
于 2013-01-31T13:51:43.487 に答える
3

iOS4.2より前のテクニックを使用するだけです。

var iosClass = Class.GetHandle ("EKReminder");
if (iOSClass != null)
    ...

Appleが推奨する方法は、MonoTouchでは機能しないgcc/clangによって特殊なケースになっているようです。

于 2013-01-31T13:51:23.810 に答える