4

我有一个从.xib设计的 NSView 子类化的 MyCustomView。

我想将此视图插入到我的其他一些 xib 的应用程序中。我该怎么做?如果我拖动自定义视图并将类更改为 MyCustomView,但这不会加载我的 xib 文件。这只能以编程方式完成,还是有办法在界面构建器中做到这一点?

编辑1:

这是一个非常小的演示项目: http ://s000.tinyupload.com/index.php?file_id=09538344018446482999

它包含默认的 MainMenu xib 和我的 CustomView xib。我希望我的CustomView.xib显示在添加到我的MainMenu.xib的自定义视图中——使用尽可能少的代码。

4

4 回答 4

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]];
}
于 2013-10-31T07:27:26.800 回答
0

使用视图控制器,因为它会为您处理 nib 加载,并提供一个连接位置IBOutletIBActions以可重用的方式。

在您的应用程序委托或任何控制器中创建您的视图控制器的实例。要求您的视图控制器加载其视图。将返回类型转换为您的视图类名称。然后保留对您的视图控制器和可能的视图的引用。

告诉任何视图将您的视图添加为子视图。添加任何布局约束。viewDidMoveToSuperview(您可以构建非常通用的约束,以通过覆盖或viewDidMoveToWindowwhensuperview或 window 不为零来将自己添加到您的视图或视图控制器 中。使用相同的约束来删除您的约束。)

奇怪的是,您通过告诉视图从其superview.

于 2013-10-31T09:26:09.543 回答
0

听起来你需要一个容器视图。但我认为您必须使用情节提要才能在界面构建器中使用它。

于 2013-10-31T07:28:49.890 回答
-1

我建议以编程方式进行:

  1. 将视图添加到您的主视图xib/storyboard并将自定义类设置为您的自定义视图的类
  2. 在自定义视图的 xib 中,将 File's Owner 类设置为自定义视图的类
  3. 根据需要连接任何IBOutlets
  4. 创建一个 __strong 属性/ivar 来保存NSView对 xib顶层的引用
  5. 在您的自定义视图的类中实现initFromFrame大致如下:
@interface 自定义视图 ()
{
    __strong NSView *nibView;
}
@结尾

@实现自定义视图

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    如果(自我){
        NSArray *nibObjects;
        [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self topLevelObjects:&nibObjects];
        nibView = nibObjects[1];
        [自我 addSubview:nibView];
    }
    回归自我;
}

IBOutlet通话后立即连接,因此loadNibNamed您可以从那里进行进一步的初始化。

另一种选择是纯粹以编程方式做事:1. 在您的自定义xib中,将根视图的类设置为您的自定义类 2.awakeFromNib在您的自定义类中实现以执行初始化 3. 调用loadNibNamed:您的自定义xib并以编程方式将其添加到没有界面的用户界面建设者。

于 2013-10-31T07:43:05.080 回答