2

私は MonoTouch を使用しており、UIButton を拡張するクラス MyButton を作成しました。これは実際には、カスタム UIScrollViewで発生していた同じ問題の単純化された例です。MyButton は UIButton を拡張し、カウンターのインクリメントとデクリメントのような簡単なことを行ういくつかのメソッドを追加します (これは単なるテスト ケースです)。また、クラス定義の前に '[Register("MyButton")]' を含めて、Interface Builder (IB) に登録し、UIButton を追加してそのクラスを MyButton として指定できるようにします。

機能: MyButton のインスタンスをプログラムでメイン ビューに追加すると、正常に表示され、期待どおりに機能します。

うまくいかないこと: IB から UIButton を追加し、そのクラスを MyButton として指定しようとすると、アウトレットを追加し、それが MyButton タイプであることも指定すると、メイン ビューをロードしようとしているときにアプリがクラッシュし、例外が発生します: Unhandledマネージド例外: GC された (System.Exception) 型 iOSCustomUIView.MyButton (0xC2F40D0) のマネージド オブジェクトで、objective-c から呼び出されたセレクター

この問題がある同様の質問を見つけましたが、ビューではなくビューコントローラーを使用しています。したがって、エラーが似ていることは理解していますが、View Controller の場合、新しいコントローラーをスタックにプッシュするときなどに参照が失われます。読み込まれました。

MyButton アウトレット (btnIncrement) を参照するために追加のプライベート メンバー変数を作成しようとしましたが、これは役に立ちませんでした。ブレークポイントを設定すると、View Controller の新しいインスタンスをインスタンス化しようとするとクラッシュが発生します: (AppDelegate.cs から)

    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        window = new UIWindow (UIScreen.MainScreen.Bounds);

        viewController = new iOSCustomUIViewViewController ();
        window.RootViewController = viewController;
        window.MakeKeyAndVisible ();

        return true;
    }

カスタム UIButton クラスを定義して IB で使用するために不足しているものはありますか? これは MonoTouch のバグですか?

4

1 に答える 1

2

Xamarin フォーラムで adamkemp から素晴らしい反応を得ました。IntPtr p解決策は、ビュー オブジェクトが xib ファイルから作成されるときに呼び出されるコンストラクターであるため、引数を受け入れるコンストラクターを作成する必要があることです。私の場合、次のコンストラクターを定義するだけです。

public MyButton(IntPtr p) : base(p)
{
    // Do initialization stuff here
}

このコンストラクターを定義していないため、オブジェクトが作成されなかった可能性があります。この場合、オブジェクトが GC されたというログ メッセージは少し誤解を招くものでした。これで、私のアプリ ビューはすべて正常に読み込まれます。

于 2013-03-15T17:27:31.063 に答える