Проверка доступности классов iOS (а не методов) в MonoTouch
Есть некоторые подробности раскрывает RespondsToSelector метод проверки доступности методов различных версий iOS.
Однако я, кажется, не могу найти, Как выполнить аналогичные проверки доступности класса.
Apple документирует это здесь , что в iOS 4.2+ вы должны попытаться получить доступ к статическому class
селектору требуемого класса. например:
if ([EKReminder class])
{
....
}
Однако это, кажется, не разоблачено. Я думаю, что это похоже на мой предыдущий вопрос здесь , в том, что для реализации этого в MT потребуется явное отображение статического свойства Class
на каждый тип MT.
Итак, я предполагаю, что мой вопрос заключается в том, должен ли я просто использовать старую технику до iOS 4.2? то есть:
Class cls = NSClassFromString (@"EKReminder");
if (cls)
{
...
}
Который, я думаю, соответствует:
var iosClass = Class.GetHandle("EKReminder");
if ( iosClass != null )
...
Или вызвать селектор вручную, используя методы взаимодействия, доступные в Messaging ?
Или какой-то другой подход, который я не нашел?
2 ответа:
Проверка safe использует:
if (Class.GetHandle (typeof (EKReminder)) != IntPtr.Zero) { // we know we can use EKReminder }
Однако это немного дорого, потому что это включает в себя размышление. Имя Objective-C может отличаться от имени .NET (например,
NSURL
противNSUrl
, и это может быть найдено только путем отражения атрибутаRegister
).Если вы знаете имя Objective-C, то вы можете использовать перегрузку, не связанную с типом safe, чтобы пропустить отражение. Например,
// 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 }