6

これを MonoTouch に変換する方法は、一生わかりません。テイカーはいますか?

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

ほとんどの場合、私が困惑しているのはView Class Descriptionです...

4

4 に答える 4

7

一般に、@Monoman のisソリューションは、MonoTouch プログラム内から CocoaTouch クラスを探している場合でも、特定のクラスのインスタンスを見つける正しい方法です。

ただし、場合によっては、MonoTouch で (または iOS プラットフォーム ヘッダーでさえ) 公開されていない内部 CocoaTouch クラスがあることに気付くことがあります。そんな時は @poupou さんのやっているような工夫が必要です

残念ながら、彼の答えはここでも通用しません。それぞれが実装view.GetType()する最も派生した MonoTouch 型を返し、次に、、またはそれぞれが間違った型で動作し、過度に一般的な答え (この場合は " ") を返します。SubviewToString()Class.Name@selector("description")UIView

これを機能させるには、@poupou が提案したよりも1 層深い層に移動する必要があります。

// ** 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;
}

これは、はるかに手間がかかるわけではありませんが (おそらくさらに少ないでしょうか?)、NSObjectdescriptionメッセージに応答するものだけでなく、どの Objective-C クラスでも機能する代替手段です。

// ** 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

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 に答える
5

現在Monotouchを使っていないのですが、サブビューのマネージド型を確認するだけでいいのでしょうか?

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

これは私のために働く:

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