我之前已经问过这个问题,但问题本身和其中的所有信息可能有点令人困惑,而且我想要得到的结果有点复杂。所以我开始了一个新的干净测试项目来处理我目前有兴趣了解的部分。
所以我想要的基本上是这样的:我有一个视图容器(继承 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
我的笔尖文件是:
- 主菜单.xib
ImageHolder.xib
MainMenu 是我启动新项目时生成的 xib。
- ImageHolder 看起来像这样: 图片链接
我将尝试在 xib ImageHolder 中提及迄今为止的连接:
文件的所有者 - 具有 ImageHolderNode 类 ImageHolder.xib 的主视图,具有类 ImageHolderView
所以要恢复,我得到的结果是视图容器中的 3 个蓝色矩形,但我似乎无法让它显示从 ImageHolder.xib 加载的视图
如果有人想看看 CocoaSlides 示例应用程序,它在苹果开发者页面上(不幸的是,我不允许发布超过 1 个链接 :))