2

我之前已经问过这个问题,但问题本身和其中的所有信息可能有点令人困惑,而且我想要得到的结果有点复杂。所以我开始了一个新的干净测试项目来处理我目前有兴趣了解的部分。

所以我想要的基本上是这样的:我有一个视图容器(继承 NSView)。在里面,我想放置一些图像,但不仅仅是简单的 NSImage 或 NSImageView,还有一些自定义视图(也继承 NSView),它本身包含一个文本字段和一个 NSImageView。我称之为“图像持有者”,它位于一个单独的 nib 文件中(我使用这种方法,因为我在 Apple SAmple 应用程序 COCOA SLIDES 之后引导自己)。到目前为止,我得到的结果是一些东西,但不是我所期望的。我想我一定是在 Interface Builder 中做错了(没有连接正确的东西),但我希望有更多专业知识的人能够启发我。

下面我将尝试放置我目前拥有的所有代码:

//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. 主菜单.xib
  2. ImageHolder.xib

  3. MainMenu 是我启动新项目时生成的 xib。

  4. ImageHolder 看起来像这样: 图片链接

我将尝试在 xib ImageHolder 中提及迄今为止的连接:

文件的所有者 - 具有 ImageHolderNode 类 ImageHolder.xib 的主视图,具有类 ImageHolderView

所以要恢复,我得到的结果是视图容器中的 3 个蓝色矩形,但我似乎无法让它显示从 ImageHolder.xib 加载的视图

如果有人想看看 CocoaSlides 示例应用程序,它在苹果开发者页面上(不幸的是,我不允许发布超过 1 个链接 :))

4

1 回答 1

0

确切地说,不是答案,因为不清楚您在问什么..

您制作了一个视图(class '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并等待笔尖加载?
在某些代码中您没有显示?

一般来说,一次进步一个步骤,让每个步骤都发挥作用。

NSAssert 是您的朋友。尝试它而不是误用警报面板和日志记录以进行调试。IE。

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

一个视图当然应该画一些东西。TextViews 绘制文本,ImageViews 绘制图像。如果您需要绘制 Cocoa 提供的文本、图像、表格等以外的内容,则应该将 NSView 子类化。

如果您需要从多个 nib 组装视图,您应该按照应用程序在 nib 中的需要排列视图,或者使用 viewController 或 windowController。这就是他们的目的。

编辑

界面生成器连接

如果 RootView 不是 nil ,那么您似乎已经正确连接了您的连接,但您说您不清楚所以..

确保 IB 窗口设置为列表视图,以便您可以清楚地看到 nib 的内容。
'File's Owner' 代表将要加载 nib 的对象,对吧?在你的情况下 ImageHolderNode。
控制 单击文件的所有者,除其他外,您可以看到它的出口。当 nib 由 ImageHolderNode 加载时,控制从插座拖动(在列表视图中)到要设置为实例 var 的对象。我知道你已经知道这一点,但没有别的了。

多哈

您究竟希望看到什么?一个空的图像视图?好吧,那看起来什么都不是。一个空的文本字段?那也一样,看起来什么都没有。将插座连接到您的 textfield 和 imageView 并在它们上设置一些内容。

于 2010-06-22T10:29:29.083 回答