和之间几乎没有区别,这里有一个很好的描述,只是后者是一种方法。respondsToSelector:
instancesRespondToSelector:
static
来自您的链接的答案用于真实instancesRespondToSelector:
类型,而不是其代理。您可以使用MonoTouch 中已有的方法获得相同的结果。Appearance
RespondsToSelector
if (new UINavigationBar ().RespondsToSelector( new Selector("setShadowImage:")))
UINavigationBar.Appearance.ShadowImage = new UIImage();
IOW 它假设如果setShadowImage:
可用,那么您可以访问它的代理。对于以前存在的功能UIAppearance
可用,情况并非如此(代码可能有效,但结果与您的期望不符)。
在 MT 中是否有不同的方法来实现这一点?
在许多情况下,您可以通过执行单个版本检查来启用/禁用多个功能,如下所示:
if (UIDevice.CurrentDevice.CheckSystemVersion (6,0)) {
// enable iOS6 new features
} else {
// fallback to iOS 5.x supported features
}
现在instancesRespondToSelector:
不是 MonoTouch 提供的公共 API 的一部分(它需要在每种类型中绑定,至少在使用生成的绑定完成时)。但是,如果您愿意,实施起来并不难。您可以使用以下代码:
IntPtr responds_handle = Selector.GetHandle ("instancesRespondToSelector:");
IntPtr appearance_handle = new UINavigationBar ().ClassHandle; // *not* Handle
IntPtr setShadowImage_handle = Selector.GetHandle ("setShadowImage:");
bool result = Messaging.bool_objc_msgSend_IntPtr (appearance_handle, responds_handle, setShadowImage_handle);
如果你在几个地方需要它,你可以把它变成一个方法。请记住,它将返回与RespondsToSelector
(针对您的特定问题)相同的答案。