1

モノタッチ5.2.13

MonoTouchバインディングを介してネイティブObjectiveCライブラリを使用しています。ライブラリはViewControllerを公開します。ビューコントローラをサブクラス化するまで、すべてが正常に機能しています。次に、NULL参照例外が発生するか、UIの一部が表示されません。

btouchツールと「-e」オプションの問題について読みました。しかし、私が見ることができることから、オプションは存在しません:

ツール/Developer/ MonoTouch / usr / bin / btouchの実行は、引数で開始されました:/d:DEBUG ApiDefinition.cs /s:StructsAndEnums.cs / tmpdir:obj / Debug / ios / / sourceonly:obj / Debug / ios//sources。リスト

サブクラスは(この例では)機能を追加しませんが、それを使用するだけでバインディングを解除できます。

// Works.
var contr = new NativeController();

// Fails with various errors. Throws a NULL reference exception about some UIPopoverController being NULL, for instance.
public class SubclassedController : NativeController
{
  public SubclassedController() : base()
  {
  }
}

var contr = new SubclassedController();

[NullAllowed]をプロパティに追加すると、NULL参照例外が解決されることがわかりました。

ネイティブコントローラーはプロパティを公開します(nonatomic, strong) UIPopoverController *popoverController。これは次のようにバインドされていましたUIPopoverController PopoveController {get; set;}-ここに追加するNullAllowedと問題が解決しました。

しかし今、私は画像が表示されないという問題に直面しており、明らかな例外はありません。

これらの問題は、サブクラス化されたバージョンを使用するときに何かがNULLであるという事実にも起因すると思いますが、ネイティブコードはNULLに反応し、それを適切に処理するようです。

これは3つの質問につながります:

  • サブクラス化を使用すると動作が異なるのはなぜですか?これを実現するためにMonoTouchは何をしていますか?派生クラスを使用する場合、なぜNULL参照を取得するのですか?どちらの場合も、UIPopoverControllerには触れていません。
  • 何が問題なのか、エラーがない場合はどうすれば修正できますか?
  • NullAllowed以外に、他に何を処理する必要がありますか?
4

2 に答える 2

2

サブクラス化を使用すると動作が異なるのはなぜですか?

インスタンスがクラス名に基づいて異なる方法で初期化するなど、いくつかの理由が考えられます。C#(非常にまれで、継承が使用される)またはObjective-C(デリゲートは動作をカスタマイズするためによく使用されます)で行うのは難しくありません。

サブクラス化がどのように機能するかを理解するには、ネイティブライブラリのドキュメントヘッダーファイルサンプル、および製品サポートを参照する必要があります。

これを実現するためにMonoTouchは何をしていますか?

モノタッチ関連ではないと思います。MonoTouchはbtouch、Objective-Cライブラリのバインディングを作成するのに役立ちます。これは、XamarinがすべてのiOSバインディングを作成するために使用するのと同じツールです。

まだわからない?同じことを行う小さなObjective-Cサンプルを作成します。結果をMonoTouchバージョンと比較します。

異なる結果?バグレポートに(C#とObjC)の両方のテストケースを入力すると、何が起こっているかを確認します(前に述べたように、btouchバグがないことを確認する十分な理由があります;-)

派生クラスを使用する場合、なぜNULL参照を取得するのですか?どちらの場合も、UIPopoverControllerには触れていません。

何が問題なのか、エラーがない場合はどうすれば修正できますか?

NullAllowed以外に、他に何を処理する必要がありますか?

この段階では、バインドしたライブラリのネイティブコードを実行しています。あなたが従う必要がある特定の規則はあなたが見つけるものです:

  • ライブラリのドキュメントを読む。
  • ライブラリソース(利用可能な場合)、ヘッダー、およびサンプルを読み取る。
  • 許可されているかどうか(たとえば、クラッシュするか[NullAllowed]どうか)をテスト(たとえば、単体テスト)することができます。null

また、既存のサンプルを移植することは、(ライブラリAPIの)優れた学習演習であり、バインディングのバグ(セレクターのタイプミス、間違ったパラメーターなど)をテストするための迅速な方法でもあります。

于 2012-08-28T12:56:13.077 に答える
2

この特定の問題は2つのものであることが判明しました。

  • 不足NullAllowedしている属性UIPopoverController
  • バインディングとは関係がないが、CocoaTouchと関係があるMonoTouch5.2.13のバグ。具体的な理由は不明です。

MonoTouch5.3.6ではすべてが期待どおりに機能しています

于 2012-08-29T07:38:18.543 に答える