7

Interface-Builder でカスタム NSView をセットアップしたいのですが、OSX で動作しません。

ViewController の .xib で、カスタム ビューを追加し、クラスを MyCustomView に設定しました。MyCustomView.h、MyCustomView.m、MyCustomView.xib を作成しました。

MyCustomView.xib では、Class も MyCustomView に設定します。MyCustomView.m では、- (void)awakeFromNib呼び出されますが、呼び出され- (id)initWithCoder:(NSCoder *)aDecoderませ- (id) awakeAfterUsingCoder:(NSCoder*)aDecoderん。

私が達成したいのは、ViewController で、追加したビューが MyCustomView.xib で設定したビューで「満たされる」ことです。それを行う最善の方法は何ですか?

編集:私は十分に明確ではなかったと思います...

MyCustomView というカスタム ビューを含む ViewController があります。

ここに画像の説明を入力

このビューのタイプは MyCustomView である必要があります。

MyCustomView.h MyCustomView.m MyCustomView.xib

存在します。私はすでに MyCustomView.xib のファイルの所有者を MyCustomView に設定しており、ViewController の CustomView を MyCustomView に設定していますが、機能しません。

私はそれを行う場合

- (void)awakeFromNib {
    NSString* nibName = NSStringFromClass([self class]);
    NSArray* topLevelObjects;
    [[NSBundle mainBundle] loadNibNamed:nibName
                              owner:nil
                    topLevelObjects:&topLevelObjects];

    NSView* view = topLevelObjects[0];
    [view setFrame:[self bounds]];
    [self addSubview:view];
}

MyCustomView ではなく、NSView タイプのビューしか取得できません... ViewController.xib に MyCustomView であることを伝える簡単な方法はありませんか?

EDIT 2:簡単なプロジェクトをアップロードしました

https://dl.dropboxusercontent.com/u/119600/Testproject.zipで、MyCustomView (ViewController ではなく window.xib 内) を使用した単純なプロジェクトを見つけますが、そこにあるボタンは表示されません。 MyCustomView.xib. まさにそれを達成したいのですが、最も簡単で最良の方法は何ですか?

4

2 に答える 2

18

編集- 申し訳ありませんが、私の既存の回答は、アウトレットとアクションを接続する必要性を考慮に入れていませんでした。この方法でそれを行う必要があります...

ファイルを考えると...

MyCustomView.h
MyCustomView.m
MyCustomView.xib

MyCustomView.h 内

  • インターフェイス要素の IBOutlets を宣言します。xib ファイルの最上位ビューへのポインターを保持するには、少なくとも 1 つ必要です。

    @property (nonatomic, strong) IBOutlet NSView *view;

MyCustomView.xib 内

  • 最上位ビューが 1 つだけであることを確認する
  • Identity Inspector でファイルの所有者クラスを MyCustomView に設定します
  • 最上位ビューがデフォルトNSViewクラスに設定されていることを確認します。
  • MyCustomView.h で宣言された IBOutlets を xib ファイルのインターフェイス オブジェクトに接続できるようになりました。少なくとも、トップレベル ビューをviewアウトレットに接続する必要があります。

MyCustomView.m で:

- (id)initWithFrame:(NSRect)frame
{
    NSString* nibName = NSStringFromClass([self class]);
    self = [super initWithFrame:frame];
    if (self) {
        if ([[NSBundle mainBundle] loadNibNamed:nibName 
                                          owner:self 
                                topLevelObjects:nil]) {
            [self.view setFrame:[self bounds]];
            [self addSubview:self.view];
            [self.myCustomButton setTitle:@"test success"];
        }
    }
    return self;
}

ウィンドウの xib ファイルで、カスタム NSView を追加し、そのクラスを MyCustomView に変更します。

10.8 より前の OSX では、メソッドloadNibNamedはクラス メソッドでした。後方互換性が必要な場合は代わりに使用してください。ただし、現在は非推奨です。

[NSBundle loadNibNamed:@"NibView" owner:self]

MyCustomView.xib のビューは MyCustomView のビューではなく、そのビューの唯一のサブビューであることに注意してください(これは、tableViewCell が単一の contentView を所有する方法に似ています)

投稿したプロジェクト サンプルでは、​​次の変更を行う必要があります。

  • MyCustomView.h で
    。NSView プロパティを追加する

  • MyCustomView.xib:
    . 最上位ビューをMyCustomViewカスタム クラスからNSView(デフォルト)に変更します
    。ファイルの所有者を に設定しますMyCustomView
    . File's owner の IBOutletsviewmyCustomButtonインターフェイス ビューとボタンに接続します
    。テストのために、ビューをかなり小さくして、ボタンを右上に押します (ここにあるため、ウィンドウには表示されません)。

  • MyCustomView.m:
    . initWithFrameすべての実装コードをここのメソッドに置き換えます

于 2013-08-23T19:49:08.437 に答える
0

ビューまたはコントロールのカスタム サブクラス (または Interface Builder で使用できるその他のクラス) をロードするには、ベース バージョン (あなたの場合は NSView を追加) を追加する必要があります。ウィンドウでそのオブジェクトを選択し、Identity Inspector (Cmd-Opt 3) に移動します。

Class の定義済みの値 (この場合は NSView) の代わりに、カスタム サブクラスの名前を入力します。ほら!

IB UX に関連する小さな詳細は、アプリをビルドして実行するときにその変更を登録するために、おそらく入力フィールドからフォーカスを移動する必要があるということです。

于 2013-08-23T23:27:24.287 に答える