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

Ric*_*ick 6 c# objective-c translate xamarin.ios ios

我不能为我的生活弄清楚如何将其翻译成MonoTouch.任何接受者?

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

大多数是视图类描述,让我难过......

sbl*_*lom 7

通常,@ Monoman的is解决方案是查找特定类实例的正确方法,即使您正在MonoTouch程序中查找CocoaTouch类.

但是,有时您会发现内部CocoaTouch类未在MonoTouch中暴露(甚至在iOS平台标题中).在这种情况下,你将不得不诉诸@poupou正在做的技巧.

不幸的是,他的答案在这里行不通.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;
}
Run Code Online (Sandbox Code Playgroud)

这里有没有一个整体很多繁琐的(?甚至更少)的替代,但在任何Objective-C类将工作,而不只是那些回应NSObjectdescription消息:

// ** 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));
}
Run Code Online (Sandbox Code Playgroud)

MonoTouch实际上并不令人感到惊讶和有点伤感object_getClassName().

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

foreach (UIView view in cell.Subviews) {
    if (GetClassName(view.Handle) == "UITableViewCellReorderControl") {
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Mon*_*man 5

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

   foreach (UIView view in cell.subviews)
   {
     if (view is UITableViewCellReorderControl) {}
   }
Run Code Online (Sandbox Code Playgroud)


pou*_*pou 5

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

以下是您可以尝试的一些事情(简单到更复杂):

调用ToStringview实例可能包括原来的类名(作为描述的一部分) -但它是不一样的调用description的的class本身.

 foreach (UIView view in cell.Subviews) {
    if (view.ToString ().Contains ("UITableViewCellReorderControl")) {
    }
 }
Run Code Online (Sandbox Code Playgroud)

接下来尝试看看是否NameClass是相同的description.

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

最后真的descriptionClass实例上调用选择器.像(未经验证)的东西:

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") {
   }
}
Run Code Online (Sandbox Code Playgroud)