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)
大多数是视图类描述,让我难过......
通常,@ 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类将工作,而不只是那些回应NSObject的description消息:
// ** 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的解决方案做你想做的事,你可能很安全.否则,你就是自己动手了.
我目前没有使用Monotouch,但是你不应该只检查子视图的托管类型吗?
foreach (UIView view in cell.subviews)
{
if (view is UITableViewCellReorderControl) {}
}
Run Code Online (Sandbox Code Playgroud)
Objective-C的处理Class主要隐藏在MonoTouch提供的API中.它主要是- System.Type并且description主要是ToString- 但这不会显示一些内部.
以下是您可以尝试的一些事情(简单到更复杂):
调用ToString的view实例可能包括原来的类名(作为描述的一部分) -但它是不一样的调用description的的class本身.
foreach (UIView view in cell.Subviews) {
if (view.ToString ().Contains ("UITableViewCellReorderControl")) {
}
}
Run Code Online (Sandbox Code Playgroud)
接下来尝试看看是否Name上Class是相同的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)
最后真的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") {
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1456 次 |
| 最近记录: |