在没有MonoTouch托管类的情况下获取Objective-C类名

时间:2012-07-25 17:32:52

标签: c# objective-c ios xamarin.ios translate

我不能为我的生活弄清楚如何将其翻译成MonoTouch。任何人?

for(UIView* view in cell.subviews)
{
    if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
    {
    }
}

主要是视图类描述令我难过......

4 个答案:

答案 0 :(得分:7)

通常,@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的{​​{1}}消息的类:

description

MonoTouch实际上并没有为// ** 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)); } 提供导入,这实在令人惊讶和有点难过。

您可以使用以下任何一种:

object_getClassName()

大胖子免责声明:几乎任何时候你都采用这样的技巧,你依赖于Apple保留改变权利的CocoaTouch实施细节。经验法则:如果你能用@ Monoman的解决方案做你想做的事,你可能安全。否则,你就是自己动手了。

答案 1 :(得分:5)

我目前没有使用Monotouch,但您不应该只检查子视图的托管类型吗?

   foreach (UIView view in cell.subviews)
   {
     if (view is UITableViewCellReorderControl) {}
   }

答案 2 :(得分:5)

Objective-C Class的处理主要隐藏在MonoTouch提供的API中。它主要是System.Typedescription主要是ToString - 但这不会显示一些内部。

您可以尝试以下几点(简单到复杂):

ToString实例上调用view可能包含原始类名(作为说明的一部分) - 但它与调用description不同class本身。

 foreach (UIView view in cell.Subviews) {
    if (view.ToString ().Contains ("UITableViewCellReorderControl")) {
    }
 }

接下来尝试查看Name上的Class是否与description相同。

foreach (UIView view in cell.Subviews) {
   MonoTouch.ObjCRuntime.Class c = new MonoTouch.ObjCRuntime.Class (view.GetType ());
   if (c.Name == "UITableViewCellReorderControl") {
   }
}

最后真正调用description实例上的Class选择器。像(未经验证)的东西:

MonoTouch.ObjCRuntime.Selector description = new MonoTouch.ObjCRuntime.Selector ("description");
foreach (UIView view in cell.Subviews) {
   MonoTouch.ObjCRuntime.Class c = new MonoTouch.ObjCRuntime.Class (view.GetType ());
   var name = NSString.FromHandle (MonoTouch.ObjCRuntime.Messaging.IntPtr_objc_msgSend (c.Handle, description.Handle));
   if (name == "UITableViewCellReorderControl") {
   }
}

答案 3 :(得分:-1)

这对我有用:

foreach(var subview in this.ContentView.Superview.Subviews)
{
    if(subview.Class.Name.EndsWith("UITableViewCellReorderControl"))
    {
    }
}