Tys*_*son 2 xamarin.ios weak-linking ios
MonoTouch公开了RespondsToSelector方法,用于检查iOS版本中方法的可用性.
但是我似乎无法找到如何对类可用性执行类似的检查.
Apple在此处记录,在iOS 4.2+中,您应该尝试访问class所需类的静态选择器.例如:
if ([EKReminder class])
{
....
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎没有暴露.我认为它类似于我之前的问题,因为要在MT中实现它,需要Class在每个MT类型上显式映射静态属性.
所以我想我的问题是,我应该使用旧的iOS 4.2前技术吗?即:
Class cls = NSClassFromString (@"EKReminder");
if (cls)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我认为映射到:
var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
...
Run Code Online (Sandbox Code Playgroud)
或者使用Messaging中提供的互操作方法手动调用选择器?
还是我找不到的其他方法?
该安全检查是使用:
if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) {
// we know we can use EKReminder
}
Run Code Online (Sandbox Code Playgroud)
然而,它有点昂贵,因为它涉及反射.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
}
Run Code Online (Sandbox Code Playgroud)
再次(并概括我对每个人的回答)使用iOS版本对非硬件功能进行运行时检查通常是最好/更容易/更快的.
if (UIDevice.CurrentDevice.CheckSystemVersion (5,0)) {
// we know feature X was added in 5.0
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
482 次 |
| 最近记录: |