我一辈子都想不通如何将它翻译成 MonoTouch。有接盘侠吗?
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
}
}
大多数情况下,让我难倒的是视图类描述......
我一辈子都想不通如何将它翻译成 MonoTouch。有接盘侠吗?
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
}
}
大多数情况下,让我难倒的是视图类描述......
一般来说,@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 的解决方案做您想做的事,那么您可能是安全的。否则,你将把事情掌握在自己手中。
我目前没有使用 Monotouch,但您不应该只检查子视图的托管类型吗?
foreach (UIView view in cell.subviews)
{
if (view is UITableViewCellReorderControl) {}
}
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
onClass
是否与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") {
}
}
这对我有用:
foreach(var subview in this.ContentView.Superview.Subviews)
{
if(subview.Class.Name.EndsWith("UITableViewCellReorderControl"))
{
}
}