我在.xib中设计了一个来自 NSView 的MyCustomView子类。
我想将此视图插入到我的其他一些xib的应用程序中。我该怎么做?如果我拖动自定义视图并将类更改为MyCustomView,但不加载我的xib文件。这只能以编程方式完成,还是有办法在界面构建器中执行此操作?
EDIT1:
这是一个非常小的演示项目: http://s000.tinyupload.com/index.php?file_id=09538344018446482999
它包含默认的MainMenu xib和我的CustomView xib。我希望我的 CustomView.xib 显示在添加到我的 MainMenu.xib 的自定义视图中 - 使用尽可能少的代码。
答案 0 :(得分:6)
要加载视图,您需要在窗口中添加: - 创建继承到NSViewController的自定义视图类
#import <Cocoa/Cocoa.h>
@interface NewViewController : NSViewController
@end
#import "NewViewController.h"
@implementation NewViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Initialization code here.
}
return self;
}
@end
您的xib名称为yourview.xib
- (void)windowDidLoad {
NSViewController *yourVC = [[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil];
[[[self window] contentView] addSubview:[yourVC view]];
}
答案 1 :(得分:0)
听起来你需要一个容器视图。但我认为你必须使用故事板才能在界面构建器中使用它。
答案 2 :(得分:0)
使用视图控制器,因为它将为您处理笔尖加载,并提供以可重用方式连接IBOutlet
和IBActions
的位置。
在您的app appate或任何控制器中创建视图控制器的实例。 让您的视图控制器加载其视图。 将返回类型强制转换为视图类名称。 然后保持对视图控制器和视图的引用。
告诉任何视图将您的视图添加为子视图。
添加任何布局约束。
(当viewDidMoveToSuperview
或窗口不是nil时,您可以通过覆盖viewDidMoveToWindow
或superview
来构建非常通用的约束以在视图或视图控制器中添加自己。使用相同的约束来删除约束。 )
奇怪的是,您通过告知视图将其自身从superview
移除来移除视图。
答案 3 :(得分:-1)
我建议以编程方式执行此操作:
xib/storyboard
并将自定义类设置为自定义视图的类IBOutlets
等NSView
的引用initFromFrame
:@interface CustomView () { __strong NSView *nibView; } @end @implementation CustomView - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { NSArray *nibObjects; [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self topLevelObjects:&nibObjects]; nibView = nibObjects[1]; [self addSubview:nibView]; } return self; }
IBOutlet
调用后,loadNibNamed
会立即连接,因此您可以从那里进行进一步的初始化。
另一种选择是纯粹以编程方式执行操作:
1.在自定义xib
中,将根View的类设置为自定义类
2.在自定义类中实现awakeFromNib
以执行初始化
3.在您的自定义loadNibNamed:
上调用xib
,并以编程方式将其添加到用户界面,而不使用界面构建器。