我想在Interface-Builder中设置一个自定义的NSView,但是我无法在OSX上使用它。

在ViewController的.xib中,添加了一个自定义 View ,并将Class设置为MyCustomView。我创建了MyCustomView.h,MyCustomView.m和MyCustomView.xib。

在MyCustomView.xib中,我也将Class设置为MyCustomView。在MyCustomView.m中,会调用- (void)awakeFromNib,但不会调用- (id)initWithCoder:(NSCoder *)aDecoder- (id) awakeAfterUsingCoder:(NSCoder*)aDecoder

我想要实现的是,在ViewController中,我添加的 View 被MyCustomView.xib中设置的 View “填充”。最好的方法是什么?

编辑:我认为我不够清楚...

我的ViewController包含一个名为MyCustomView的自定义 View 。

该 View 的类型应为MyCustomView,其中

MyCustomView.h
MyCustomView.m
MyCustomView.xib

存在。我已经将MyCustomView.xib的文件所有者设置为MyCustomView,并且已经将ViewController中的CustomView设置为MyCustomView,但是它不起作用。

如果我这样做

- (void)awakeFromNib {
    NSString* nibName = NSStringFromClass([self class]);
    NSArray* topLevelObjects;
    [[NSBundle mainBundle] loadNibNamed:nibName
                              owner:nil
                    topLevelObjects:&topLevelObjects];

    NSView* view = topLevelObjects[0];
    [view setFrame:[self bounds]];
    [self addSubview:view];
}

我只能看到NSView类型的 View ,而不是MyCustomView...。没有简单的方法告诉ViewController.xib这是MyCustomView吗?

编辑2:我上传了一个简单的项目

https://dl.dropboxusercontent.com/u/119600/Testproject.zip处,您可以找到一个带有MyCustomView的简单项目(不在ViewController中,而是在window.xib中)-但是它没有显示MyCustomView.xib中的按钮。我想实现这一目标-最简单,最好的方法是什么?

最佳答案

编辑-抱歉,我现有的答案未能考虑到联系 channel 和行动的需要。这种方式应该做到这一点...

给定文件...

MyCustomView.h
MyCustomView.m
MyCustomView.xib

在MyCustomView.h中
  • 为您的界面元素声明IBOutlets。您至少需要一个指针来保存指向xib文件中顶级 View 的指针
    @property (nonatomic, strong) IBOutlet NSView *view;

  • 在MyCustomView.xib中
  • 确保只有一个顶级 View
  • 在Identity Inspector
  • 中将文件的所有者类设置为MyCustomView
  • 确保将顶级 View 设置为默认的NSView类。
  • 现在,您可以将MyCustomView.h中声明的IBOutlet连接到xib文件中的接口(interface)对象。至少您需要将顶层 View 连接到view导出。

  • 在MyCustomView.m中:
    - (id)initWithFrame:(NSRect)frame
    {
        NSString* nibName = NSStringFromClass([self class]);
        self = [super initWithFrame:frame];
        if (self) {
            if ([[NSBundle mainBundle] loadNibNamed:nibName
                                              owner:self
                                    topLevelObjects:nil]) {
                [self.view setFrame:[self bounds]];
                [self addSubview:self.view];
                [self.myCustomButton setTitle:@"test success"];
            }
        }
        return self;
    }
    

    在窗口的xib文件中,添加一个自定义NSView并将其类更改为MyCustomView。

    在10.8之前的OSX中,方法loadNibNamed是一个类方法-如果需要向后兼容,请改用它,但现在不建议使用:
    [NSBundle loadNibNamed:@"NibView" owner:self]
    

    请注意,MyCustomView.xib的 View 不是MyCustomView的 View ,而是其 View 的唯一 subview (这类似于tableViewCell拥有单个contentView的方式)。

    在您发布的项目样本中,您需要进行以下更改:

    MyCustomView.h中的

  • 。添加一个NSView属性
  • MyCustomView.xib中的
  • :
    。将顶层 View 从MyCustomView自定义类更改为NSView(默认设置)
    。将文件的所有者设置为MyCustomView
    。将IBOutlet从文件所有者的viewmyCustomButton连接到界面 View 和按钮
    。为了进行测试,将 View 缩小了很多,然后将按钮向上推到右上角(您不会在这里看到它,因为它在这里)
  • MyCustomView.m中的
  • :
    。在此处用initWithFrame方法替换所有实现代码
  • 10-08 06:24