2016-05-26 11 views
1

私はUITextViewを使って、そのSubViewsプロパティを使って繰り返しています。私はその後、いくつかの奇妙な理由からUITextSelectionViewとUIViewを比較する奇妙な型チェック結果

if(element.GetType() != typeof(UIView)) 

UITextSelectionViewがtrueと評価された例えばUITextViewのいくつかのサブタイプを使用してとのUIViewを発見したタイプを比較します。

私の知るところでは、派生クラスはfalseと評価する必要があります。ここで何が起こっていますか?

私の場合、私はUITextViewの一部であるUIContainerViewを取得し、それを反復することで私にUITextSelectionViewが与えられます。

view (parent)element (child)

それぞれのタイプで示すが、のUIView両方について

view.GetType().FullNameelement.GetType().FullNameリターン共に。

「本物のための」型をチェックする唯一の方法は、オブジェクトにキャストしているようだ:

> ((object)view).Class.Name "_UITextContainerView" 

> ((object)element).Class.Name "UITextSelectionView" 

どの - 私のために - メソッドGetTypeを(使用してのように、すべて同じではありません)とtypeof演算。リンゴのdevのどちらで私はそれを見つけるhttps://developer.xamarin.com/api/type/UIKit.UIView/

は残念ながらxamarinのUIKitの-APIのエントリがないhttps://developer.apple.com/search/?q=UITextSelectionView

が、私はそれのように派生していることを示しているここでは、ヘッダー・ファイルを見つけるように見えました私は考えました:http://developer.limneos.net/?framework=UIKit.framework&header=UITextSelectionView.h

+0

それはあなたが達成しようとしているものは明らかではないのですが。正確にUIViewではないUITextViewのサブビューを探しますか? UITextSelectionViewはUIViewではないので、その場合は必要に応じて動作します。 GetTypeメソッドとtypeof演算子を使用してTypesを比較すると、equalityは2つの型がまったく同じで、等価性が継承階層を考慮しない場合にのみtrueに評価されます。 – kyurkchyan

+0

@kyurkchyan私はUIViewsの構造を持っており、UIViewsもそうです。これらのUIViewには、UITextViewなどの他の要素が含まれています。先頭のUIViewから反復すると、すべてのUIViewが返されますが、UITextSelectionViewにはUIViewと質問はありません。なぜですか?上の私の例は、ケースを再現する方法の例です。 – isHuman

答えて

0

私はxamarinの選手の一人でショートメール交換を持っていたし、彼は

を書いた私たちは、ネイティブとマネージ型の間で1対1のマッピングを持ってしようとするが、 これは100を実装することは不可能です%iOSが持つタイプのすべてを知っているわけではありません(多くの場合、iOSはプライベートタイプを使用しています)。 のケースでは、Objective-Cの型は実行時にも生成されます。

残念ながらXamarin.iOSは、マネージラッパーの種類が コンパイル時に知られているものに限定されている(と彼らはまた、公開APIとして文書化されなければならない)を意味し、ランタイム、 で管理タイプを生成することはできません。

これは、あなたがその タイプまさにあなたのケースであるネイティブのObjective-Cのオブジェクト (あなたが唯一の最も近い公共のタイプを取得します)、の型と一致しないマネージラッパーオブジェクトで終わることができます。

ただし、実行時に、あなたは、あなたが)管理ToStringメソッドに(同等のネイティブ 「説明」セレクタの出力を見ている(あなたの特定のケースで提供されて をネイティブオブジェクト の実際の型を見ることができます正確な実行時の型の文字列表現 を返します)。

あなたがその根底にあるのObjective-C タイプが正確にUIViewのあるものにオブジェクトをフィルタリングする場合は、このような何か試すことができます。

if (element.Class.Handle != ObjCRuntime.Class.GetHandle (typeof (UIView)) 
1

iOSには個の専用のタイプがあります。UITextSelectionViewのように聞こえます。プライベートタイプは、Xamarinに拘束されていない(Appleによる)拒否されています(アプリ拒否につながる)。また、iOSバージョンごとに異なる場合もあります。

UIViewの特定のチェックは、サブクラス(パブリックまたはプライベートのいずれか)を考慮しません。

if(element.GetType() != typeof(UIView)) 

これはあなたが本当に望むものではないかもしれません。あなたは次のようなコードを使用することを検討すべきであるUIViewフィルタリングする場合:このよう

if (!(element is UIView)) 

UIViewの任意のサブクラスを考えるとiOSの将来のリリースで起こるかもしれない内部の変化に対してより堅牢になります。

+0

私は、他の要素のコンテナとして、UIViewとそのオブジェクトのみを使用しています。そして、私はこれらのオブジェクトを繰り返し、特定のことを行うにはこれら(サブクラスなし、何もない)のみを繰り返したいと思います。問題は今、UIViewではないが、私のresultlistにUITextSelectionViewがあるということです。 – isHuman