一般来说,@Monoman's is solution 是查找特定类实例的正确方法,即使是在 MonoTouch 程序中查找 CocoaTouch 类时也是如此。
但是,有时您会发现有一个内部 CocoaTouch 类未在 MonoTouch 中公开(甚至在 iOS 平台标头中)。在这种情况下,您将不得不求助于tricks like @poupou is doing。
不幸的是,他的答案在这里也行不通。 view.GetType() 正在返回每个 Subview 实现的最衍生的 MonoTouch 类型,然后是 ToString()、Class.Name 甚至 @selector("description") 每个都在错误的类型上操作并给出过于通用的答案(“UIView " 在这种情况下)。
为了完成这项工作,您必须比@poupou 建议的更深入一层。
// ** using MonoTouch.ObjCRuntime; **
private string GetClassName (IntPtr obj) {
Selector description = new Selector ("description");
Selector cls = new Selector ("class");
IntPtr viewcls = Messaging.IntPtr_objc_msgSend (obj, cls.Handle);
var name = NSString.FromHandle (Messaging.IntPtr_objc_msgSend (viewcls, description.Handle));
return name;
}
这里有一个替代方案,它不是更复杂(甚至可能更少?),但适用于任何 Objective-C 类,而不仅仅是那些响应NSObject 的description 消息的类:
// ** using System.Runtime.InteropServices; **
[DllImport ("/usr/lib/libobjc.dylib")]
private static extern IntPtr object_getClassName (IntPtr obj);
private string GetClassName (IntPtr obj) {
return Marshal.PtrToStringAuto(object_getClassName(obj));
}
MonoTouch 还没有为object_getClassName() 提供导入,这确实令人惊讶,也有点遗憾。
您可以使用其中任何一种:
foreach (UIView view in cell.Subviews) {
if (GetClassName(view.Handle) == "UITableViewCellReorderControl") {
}
}
大胖子免责声明:几乎任何时候您使用这些技巧时,您都依赖于 Apple 保留更改权利的 CocoaTouch 实现细节。经验法则:如果您可以使用 @Monoman 的解决方案做您想做的事,那么您可能是安全的。否则,您将自己处理事情。