8

MonoTouchを使用して、カスタムビューを作成しようとしているので、このビューを1つの画面で複数回再利用できます。(これはたくさんのラベルとボタンです)この投稿への回答を読んだ後: モノタッチでXIBファイルで定義されたビューにカスタムビューを追加する方法 私は近づいている必要がありますが、これはカスタムビューを追加することしかできないようです、 myCustomView.CSで定義されていますが、私が探しているのは、別の.XIBを使用してInterface Builderでカスタムビューを設計し、対応するcs-fileのみを使用してロジックを追加する方法です。同じ名前のXIBを作成しようとすると、内容が表示されません。

次の手順:

  • MyCustomView.CSに入れ[Register("MyCustomView")]ました。

  • コンストラクターを実装しましたpublic MyView(IntPtr handle) : base(handle) {}

  • Interface BuilderでViewController.XIBを開き、UIViewを追加して、そのクラスをMyCustomViewに設定します。

このコードを実行すると、新しく追加されたUIViewが表示されますが、ビュー内の要素、つまりMyCustomView.XIBのコンテンツは表示されません。

MyCustomView.CSのコードに何かを追加すると、this.Backgroundcolor = UIColor.Blue;このように表示されますが、.XIBに追加された要素は表示されません。MyCustomView.XIB内で定義されたすべてのものを表示するようにMonotouchに指示するにはどうすればよいですか?

Objective-Cのサンプルでは、​​「initWithNib」のようなものが表示されます。残念ながら、「LoadNib」セクションはMonotouch APIに文書化されていませんが、それは私がすべきことのように聞こえますが、どのように、どこで?

4

3 に答える 3

8

obj-cコードでの経験に基づいて、次のコードを試してみます。

var views = NSBundle.MainBundle.LoadNib(nibName, this, null); // (1)
MyCustomView myView = Runtime.GetNSObject(views.ValueAt(0)) as MyCustomView; // (2)

(1)xibファイルをロードできます

(2)IntPtrを適切に型指定されたNSObject(サブ)型に変換するために変換できます。

取得したらmyView、従来のビューとして追加できます。ビューのouteltが正しく設定されているかどうかを確認してください。

PSあなたが他のいくつかの詳細を提供するならば、我々はあなたを助けることができます。さらに、手書きで書いているのでコードを確認してください。

于 2012-06-27T20:48:12.203 に答える
6

非常に良い質問ですが、それはXIBがどのように機能するか、そしてそれに対して何ができるかということです。

問題は、オブジェクトをXIBに追加し、それをカスタムクラスに設定する場合、UIKitにこのオブジェクトのインスタンスを作成するように指示するだけです。IBでビュー、ボタン、またはその他のコントロールとして表示されるという事実は、IBがそれを描画する方法です。このように、見通しを作成する責任は完全にクラスにあります。

Objective-Cでは、カスタムビューを備えたXIBを作成し、追加されたビューのクラス名を設定することで、それらをIBに追加するための優れたチートを行うことができます。これが可能なのは、Objective-Cのクラスの-initメソッドから任意のインスタンスを返すことができるためです。これはC#では不可能です。

ただし、次のようにすることで、生活を楽にすることができます。

  1. XIBを、カスタムビューのコンテンツを含むXIBとして定義しましょう。カスタムビューを追加するXIBとなる配置。
  2. カスタムビュークラスとXIBを作成して、その内部を配置します
  3. AwakeFromNibメソッドを処理して、実際にXIBをロードします
  4. XIBをロードした後、その内部をサブビューとしてインスタンスに追加するだけです。
  5. 通常のビューを配置し、クラスを独自のプレースメントに設定します
  6. 楽しみ!

ただし、XIBにルートビューなどが含まれることを受け入れる必要があります。これは、Placementに配置されたクラスのインスタンスにサブビューとして追加されます。

このように、次のようなものが必要です。

カスタムビューコンテンツを含むXIB:

カスタムビューコンテンツを含むXIB

XIBを追加する場所:

XIBを追加する場所

プレースメントに追加されたビューインスタンスはXIBのファイル所有者と同じであるため、XIBとプレースメントの両方でアウトレットとアクションを設定できます。XIBのルートビューは、UIKitがPlacementに配置するために作成するインスタンスではないことを忘れないでください。

便宜上、このようなビューの作成を容易にする基本クラスである以下のコードを見つけてください。

using System;

using MonoTouch.ObjCRuntime;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace Member.iOS.Base.Views {

    /// <summary>
    /// XibView is a Xib-backed UIView subclass which enables easy customization and custom
    /// behavior addition.
    /// </summary>
    public class XibView : UIView {

        /// <summary>
        /// Exception thrown when a loaded XIB doesn't contain any views inside it.
        /// </summary>
        class EmptyXibException : Exception {
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="Member.iOS.Base.Views.XibView"/> class.
        /// </summary>
        /// <param name='handle'>
        /// Handle.
        /// </param>
        public XibView(IntPtr handle) : base(handle) {
        }

        /// <summary>
        /// Upon loading from a containing XIB, takes care of replacing the current instance (which acts as a stab) with
        /// a real view loaded from its XIB.
        /// </summary>
        public override void AwakeFromNib() {
            base.AwakeFromNib();

            NSArray views = NSBundle.MainBundle.LoadNib(GetType().Name, this, new NSDictionary());

            if (views.Count == 0) {
                throw new EmptyXibException();
            }

            UIView rootView = Runtime.GetNSObject(views.ValueAt(0)) as UIView;
            rootView.Frame = new System.Drawing.RectangleF(0, 0, Frame.Width, Frame.Height);
            AddSubview(rootView);
        }

    }
}
于 2012-11-10T19:51:55.040 に答える
0

nibファイルの代わりに、コンテナビューを使用して簡単にすることができます。あなたはこのようなことを試すことができます

于 2019-03-02T09:00:25.550 に答える