我不能为我的生活弄清楚如何将其翻译成MonoTouch。任何人?
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
}
}
主要是视图类描述令我难过......
答案 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.Type
而description
主要是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"))
{
}
}