使用与多个View Controller相同的NIB

时间:2011-03-17 01:08:07

标签: objective-c cocoa nsview iboutlet nsviewcontroller

基本上我想使用nib文件和视图控制器作为我计划多次创建的视图的模板。这个笔尖将有几个标签和自定义视图。 我的想法是,我将迭代一个对象数组,每个我将创建一个这个控制器的实例,并将一个属性设置为数组中对象的属性。

这一切都很好用,除了一件事 - 当我调用setStringValue时标签不会更新:!!!

我在视图控制器的代码中使用一个方法来进行更改,但它只是不起作用,我猜测IBOutlet没有被正确连接,这很奇怪,因为自定义视图正在挂钩完美。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在awakeFromNib上设置断点,并在调试器中查看标签出口的值。在调用awakeFromNib之前,应该已连接所有插座。如果它仍然是零,你有答案。调用setStringValue:on nil确实“没有”。在这种情况下,你没有正确绑定插座或者你曾经正确绑定它,后来改变了名称,在这种情况下,Xcode4或界面生成器中应该有一个黄色警告三角形,表明出现了问题;但是它不会阻止你的应用程序构建或运行,插件将在创建对象后保持其初始值(为零)。

答案 1 :(得分:0)

当您分配NSViewControllers时,只需使用名称为NIB的init:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

答案 2 :(得分:0)

感谢您的回复,他们很有帮助,但并不是我所得到的。 我最终通过创建一个空的NIB并用一个自定义的NSView和一些其他控件填充它来解决它。我为这些控件创建了一个带有IBOutlets的NSView子类,并在界面构建器中将自定义视图的标识设置为我的子类。 让它工作的技巧每个时间我想绘制它是通过在我的子类中创建一个类方法来加载nib并按照我想要的方式返回视图设置。

以下代码:

+(id)todoViewFromNibWithFrame:(NSRect)frameRect todoList:(TodoList *)aTodoList
{
    NSNib *todoViewNib = [[NSNib alloc] initWithNibNamed:@"TodoView" bundle:nil];
    NSArray *objects = nil;

    id todoView = nil;

    [todoViewNib instantiateNibWithOwner:nil topLevelObjects:&objects];
    for (id object in objects) {
        if ([object isKindOfClass:[self class]]) {
            todoView = object;
            [todoView setTodoList:aTodoList];
            break;
        }
    }

    [todoViewNib release];
    return todoView;
}

再次感谢您的回复! 史蒂夫