これを MonoTouch に変換する方法は、一生わかりません。テイカーはいますか?
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
}
}
ほとんどの場合、私が困惑しているのはView Class Descriptionです...
これを MonoTouch に変換する方法は、一生わかりません。テイカーはいますか?
for(UIView* view in cell.subviews)
{
if([[[view class] description] isEqualToString:@"UITableViewCellReorderControl"])
{
}
}
ほとんどの場合、私が困惑しているのはView Class Descriptionです...
一般に、@Monoman のis
ソリューションは、MonoTouch プログラム内から CocoaTouch クラスを探している場合でも、特定のクラスのインスタンスを見つける正しい方法です。
ただし、場合によっては、MonoTouch で (または iOS プラットフォーム ヘッダーでさえ) 公開されていない内部 CocoaTouch クラスがあることに気付くことがあります。そんな時は @poupou さんのやっているような工夫が必要です。
残念ながら、彼の答えはここでも通用しません。それぞれが実装view.GetType()
する最も派生した MonoTouch 型を返し、次に、、またはそれぞれが間違った型で動作し、過度に一般的な答え (この場合は " ") を返します。Subview
ToString()
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;
}
これは、はるかに手間がかかるわけではありませんが (おそらくさらに少ないでしょうか?)、NSObject
のdescription
メッセージに応答するものだけでなく、どの 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 のソリューションでやりたいことができれば、おそらく安全です。それ以外の場合は、問題を自分の手に委ねることになります。
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") {
}
}
現在Monotouchを使っていないのですが、サブビューのマネージド型を確認するだけでいいのでしょうか?
foreach (UIView view in cell.subviews)
{
if (view is UITableViewCellReorderControl) {}
}
これは私のために働く:
foreach(var subview in this.ContentView.Superview.Subviews)
{
if(subview.Class.Name.EndsWith("UITableViewCellReorderControl"))
{
}
}