MonoTouch公开了RespondsToSelector方法,用于检查iOS版本中方法的可用性。
但是我似乎无法找到如何对班级可用性进行类似的检查
Apple documents it here在iOS 4.2+中,您应该尝试访问所需类的静态class
选择器。 e.g:
if ([EKReminder class])
{
....
}
然而,这似乎并没有暴露出来。我认为它类似于my previous question here,因为要在MT中实现它,需要在每个MT类型上显式映射Class
静态属性。
所以我想我的问题是,我应该使用旧的iOS 4.2前技术吗?即:
Class cls = NSClassFromString (@"EKReminder");
if (cls)
{
...
}
我认为映射到:
var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
...
或者使用Messaging中提供的互操作方法手动调用选择器?
还是我找不到的其他方法?
答案 0 :(得分:5)
安全检查正在使用:
if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) {
// we know we can use EKReminder
}
然而,它有点昂贵,因为它涉及反射。 Objective-C名称可能与.NET名称不同(例如NSURL
与NSUrl
,只能通过反映Register
属性来找到。
如果你知道Objective-C名称,那么你可以使用非类型安全的重载来跳过反射。 E.g。
// 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
}
答案 1 :(得分:3)
只需使用iOS 4.2之前的技术:
var iosClass = Class.GetHandle ("EKReminder");
if (iOSClass != null)
...
Apple推荐的方法似乎是由gcc / clang特殊设置的,在MonoTouch中不起作用。