2

MonoTouch 公开了RespondsToSelector方法,用于检查跨 iOS 版本的方法的可用性。

但是,我似乎不知道如何对课程可用性进行类似的检查。
Apple 在此处记录了在 iOS 4.2+ 中您应该尝试访问class所需类的静态选择器。例如:

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

然而,这似乎并没有暴露出来。我认为这与我之前的问题类似,因为要在 MT 中实现这一点,需要Class在每个 MT 类型上显式映射静态属性。

所以我想我的问题是,我应该只使用旧的 pre iOS 4.2 技术吗?IE:

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

我认为映射到:

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

或者使用Messaging中可用的互操作方法手动调用选择器?

还是我没有找到的其他方法?

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

只需使用 iOS 4.2 之前的技术:

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

Apple 推荐的方法似乎是 gcc/clang 的特例,在 MonoTouch 中不起作用。

于 2013-01-31T13:51:23.810 回答