2

これについては以前に質問しましたが、質問自体とその中のすべての情報が少し混乱している可能性があります。さらに、取得したい結果はもう少し複雑です。そこで、今のところ理解したい部分だけを処理するために、新しいクリーンテストプロジェクトを開始しました。

だから私が欲しいのは、基本的にこれです:私はビューコンテナを持っています(NSViewを継承します)。内部に、単純なNSImageまたはNSImageViewだけでなく、テキストフィールドとNSImageViewを含むカスタムビュー(NSViewも継承)を配置したいと思います。私がそれを呼んだこの「画像ホルダー」は、別のnibファイルにあります(私はApple SAmpleアプリケーション、COCOAスライドの後に自分自身を導いているのでこのアプローチを使用しています)。私がこれまでに得た結果は何かですが、私が期待しているものではありません。私はInterfaceBuilderで何か間違ったことをしているに違いないと思っています(適切なものを接続していない)が、もっと専門知識のある人が私を教えてくれることを願っています。

以下に、これまでに持っているすべてのコードを入れてみます。

//ImagesContainer.h
#import <Cocoa/Cocoa.h>


@interface ImagesContainer : NSView {

}
@end
//ImagesContainer.m
#import "ImagesContainer.h"
#import "ImageHolderView.h"
#import "ImageHolderNode.h"
@class ImageHolderView;
@class ImageHolderNode;
@implementation ImagesContainer

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
  //create some subviews
  for(int i=0;i<3;i++){
   ImageHolderNode *node = [[ImageHolderNode alloc] init];
   [self addSubview:[node rootView]];
  }
    }
 NSRunAlertPanel(@"subviews", [NSString stringWithFormat:@"%d",[[self subviews] count]], @"OK", NULL, NULL);
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    // Drawing code here.

 [[NSColor blackColor] set];
 NSRectFill(NSMakeRect(0,0,dirtyRect.size.width,dirtyRect.size.height));
 int i=1;
 for(NSView *subview in [self subviews]){
  [subview setFrameOrigin:NSMakePoint(10*i, 10)];
  i++;
 }
}

@end

//ImageHolderView.h
#import <Cocoa/Cocoa.h>


@interface ImageHolderView : NSView {
 IBOutlet NSImageView *imageView;
}
@end
//ImageHolderVIew.m
#import "ImageHolderView.h"


@implementation ImageHolderView
- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    // Drawing code here.
 [[NSColor blueColor]set];
 NSRectFill(NSMakeRect(10,10, 100, 100));
 //[super drawRect:dirtyRect];
}
@end

//ImageHolderNode.h
#import <Cocoa/Cocoa.h>
@class ImageHolderView;

@interface ImageHolderNode : NSObject {
 IBOutlet ImageHolderView *rootView;
 IBOutlet NSImageView *imageView;
}
-(NSView *)rootView;
-(void)loadUIFromNib;
@end

//ImageHolderNode.m
#import "ImageHolderNode.h"


@implementation ImageHolderNode

-(void)loadUIFromNib {
 [NSBundle loadNibNamed:@"ImageHolder" owner: self];
}
-(NSView *)rootView {
 if( rootView == nil) {
  NSRunAlertPanel(@"Loading nib", @"...", @"OK", NULL, NULL);
  [ self loadUIFromNib];
 }
 return rootView;
}

@end

私のペン先ファイルは次のとおりです。

  1. MainMenu.xib
  2. ImageHolder.xib

  3. MainMenuは、新しいプロジェクトを開始したときに生成されるxibです。

  4. ImageHolderは次のようになります: 画像リンク

これまでのところ、xibImageHolderで接続について説明します。

ファイルの所有者-ImageHolderNodeのクラスがありますImageHolder.xibのメインビューには、ImageHolderViewクラスがあります

再開すると、ビューコンテナに3つの青い長方形が表示されますが、ImageHolder.xibからロードされたビューを表示させることはできません。

誰かがCocoaSlidesサンプルアプリケーションを見たい場合は、アップルの開発者ページにあります(残念ながら、複数のリンクを投稿することは許可されていません:))

4

1 に答える 1

0

あなたが何を求めているのかがはっきりしないので、正確には答えではありません。

ビューを作成します(クラス'ImagesContainer')。それをimagesContainerViewと呼びましょう。

ImagesContainerViewは、3つのオブジェクト(クラス'ImageHolderNode')を作成します。ImagesContainerViewは、各imageHolderNodeに-rootView(おそらく'ImageHolderView')を要求し、そのビュー階層に戻り値を追加します。

ImagesContainerViewは、各imageHolderNodeを破棄します(ただし、リークします)。

したがって、ビューheirachyは次のようになります。-

+ imagesContainerView
    + imageHolderView1 or maybe nil
    + imageHolderView2 or maybe nil
    + imageHolderView3 or maybe nil

これはあなたが期待していることですか?

では、どこに電話-(void)loadUIFromNibして、ペン先が読み込まれるのを待ちますか?
一部のコードでは、表示されていませんか?

一般に、一度に1つのステップを進め、各ステップを機能させます。

NSAssertはあなたの友達です。アラートパネルを誤用したり、デバッグ目的でログを記録したりする代わりに、試してみてください。すなわち。

ImageHolderNode *node = [[[ImageHolderNode alloc] init] autorelease];
NSAssert([node rootView], @"Eek! RootView is nil.");
[self addSubview:[node rootView]];

もちろん、ビューは何かを描く必要があります。TextViewsはテキストを描画し、ImageViewsは画像を描画します。Cocoaが提供するテキスト、画像、表など以外のものを描画する必要がある場合は、NSViewをサブクラス化する必要があります。

複数のペン先からビューを組み立てる必要がある場合は、アプリが必要とするようにペン先でビューを配置するか、viewControllerまたはwindowControllerを使用する必要があります。それが彼らの目的です。

編集

InterfaceBuilderの接続

RootViewがnilでない場合は、接続が正しく接続されているように見えますが、不明であると言います。

ペン先の内容をはっきりと確認できるように、IBウィンドウがリストビューに設定されていることを確認してください。
「ファイルの所有者」は、ペン先をロードしようとしているオブジェクトを表しますよね?あなたの場合、ImageHolderNode。
コントロールファイルの所有者をクリックすると、とりわけ、ファイルのアウトレットが表示されます。ペン先がImageHolderNodeによってロードされるときに、アウトレットからインスタンス変数として設定するオブジェクトへのドラッグを(リストビューで)制御します。私はあなたがこれをすでに知っていることを知っています、しかしそれには他に何もありません。

ドー

あなたは正確に何を見ることを期待していますか?空のimageView?まあ、それは何もないように見えます。空のテキストフィールド?それも、何もないように見えます。テキストフィールドとimageViewにアウトレットを接続し、それらにコンテンツを設定します。

于 2010-06-22T10:29:29.083 に答える