1

Xcode 3.2.6 / MonoTouch 4.2.x / MonoDevelop 2.6で開発中のiPadプロジェクトがあり、Monotouch 5、MonoDevelop 2.8.1、およびXcode 4.2をインストールすると、プロジェクトがコンパイルされ、正常に実行されます。しかし、Xcode 4.2でXIBファイルを変更し始めたとき(アウトレットを追加したとき)、いくつかの不具合が発生し始めました。

1)アプリがクラッシュし、デバッグモードのMonoDevelopは、ビューアウトレットが設定されていないため、ビューがロードされなかったことを示します。Xcode 4.2では、.hファイルに「view」という名前のアウトレットを作成する必要はなく、ファイル所有者ビューをデザイナのビューコントロールに接続するだけでよいことがわかりました。正しい?

2)主な問題であり、まだ解決されていないのは、「セレクターsetXxxxxが見つかりませんでした」という例外が発生することです。「xxxxx」はUIコントロールのアウトレットの名前です。これは、ベースView Controllerから継承したViewControllerで発生し始めましたが、他の通常のviewControllerを変更し始めるとすぐに、同じタイプのエラーが発生します。何が悪いのかについてのヒントはありますか?

3)いくつかのビューを動的にロードし、正常に動作するコントローラーがあります。しかし、このサブビューアウトレットの1つ(UILabelのテキストなど)にプロパティを設定すると、値は(デバッガーで)設定されますが、UIは変更されません。たとえば、アクションは正常に機能します。何が悪いのか。

4)Xcode4.2でMonoDevelop2.8とうまく統合するために必要な、XIBの特別な設定はありますか?

以前のツールとモノタッチのセットに戻ることを考えましたが、プロジェクトがアップグレードされると、現在行われているすべての開発を失うことなく戻る方法はないと思います。

ありがとう、ペドロ

編集:MonoTouch 5によって生成された新しいクリーンな属性の[Outlet]コード(以前に生成された多くのコードを置き換える)のほかに、重要な違いは、生成された部分クラスがパブリックであり、現在はプライベートである前に、これが私の問題の原因である可能性があることです。パブリック部分クラスを生成する方法や保護する方法はありますか?

編集2:designer.csでMonoTouchによって生成された部分クラスとメンバーにpublicキーワードを手動で追加すると、セレクターは舞台裏で生成され、すべての作業が行われます。これは、パブリックからプライベートの部分クラスへの変更に伴い、MonoTouch 5でバインディングの生成が変更されたことを示しています。これは、設計によるものですか、それともバグによるものですか。アウトレットを使用してビューコントローラーを作成できなくなり、サブクラス化され、子ビューコントローラーが親クラスのアウトレットにアクセスできなくなるのは非常に奇妙なことです。

4

1 に答える 1

4

1)確かに、Objective-CプロパティであるベースUIViewControllerクラスにビューアウトレットがあります。Interface Builder 3をMonoTouchで使用する場合、IBはベースビューアウトレットへの接続を許可しないことが多かったため、多くのユーザーがカスタムサブクラスで独自のサブクラスを作成しました。MonoDevelop 2.6以前では、これらのカスタムアウトレットをivar(Objective-Cフィールド)として作成しました。UIKitランタイムは、オブジェクトをアウトレットの両方のバージョン(カスタムivarとベースプロパティの両方)に接続するようです。MonoDevelop 2.8は、カスタム・アウトレットをプロパティとして生成します。つまり、冗長ビュー・アウトレットがベース・ビュー・アウトレットをシャドウするため、ベース・ビュー・アウトレットが設定されることはなく、UIKitは不満になります。冗長なカスタムビューアウトレットを削除することでこれを修正できます-MD2.8.2はこれを自動的に行います

2)基本クラスで定義されたカスタムアウトレットへの接続を妨げるカスタムアウトレットをMonoTouchがエクスポートする方法のバグのようです。考えられる回避策は、バグレポートに記載されています。

3)アプリがデバッガーで一時停止している間、UIレンダリングは更新されません。次のメインループの反復で、更新されます。

4)いいえ。

5)クラスのアクセシビリティは、デザイナークラスの部分ではなく、ユーザークラスの部分で制御する必要があります。これにより、自由に変更できます。

于 2011-10-21T13:27:32.733 に答える