6

我一辈子都想不通如何将它翻译成 MonoTouch。有接盘侠吗?

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

大多数情况下,让我难倒的是视图类描述......

4

4 回答 4

7

一般来说,@Monoman 的is解决方案是查找特定类的实例的正确方法,即使您正在从 MonoTouch 程序中查找 CocoaTouch 类。

然而,有时您会发现有一个内部 CocoaTouch 类没有在 MonoTouch 中公开(甚至在 iOS 平台标头中)。在这种情况下,您将不得不求助于@poupou 正在做的技巧。

不幸的是,他的答案在这里也行不通。view.GetType()正在返回每个实现的最派生的 MonoTouch 类型,Subview然后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'sdescription消息的类:

// ** 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 的解决方案做您想做的事,那么您可能是安全的。否则,你将把事情掌握在自己手中。

于 2012-07-26T06:03:53.900 回答
5

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

   foreach (UIView view in cell.subviews)
   {
     if (view is UITableViewCellReorderControl) {}
   }
于 2012-07-25T17:41:33.333 回答
5

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

您可以尝试以下几件事(从简单到复杂):

调用实例可能包括原始类名(作为描述的一部分) - 但它与调用ToString自身不同。viewdescriptionclass

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

接下来尝试查看NameonClass是否与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") {
   }
}
于 2012-07-25T20:22:00.917 回答
-1

这对我有用:

foreach(var subview in this.ContentView.Superview.Subviews)
{
    if(subview.Class.Name.EndsWith("UITableViewCellReorderControl"))
    {
    }
}
于 2016-01-14T15:30:06.017 回答