在Objective C ++中加载Nib并显示窗口

时间:2009-08-30 18:03:13

标签: c++ objective-c cocoa objective-c++

我正在尝试使用Objective C ++从C ++构造函数加载Nib。我已经搜索并找到了足够的示例来获取一些代码,但它不显示窗口。或任何窗口。

以下是构造函数的示例:

JokeSystem::JokeSystem() : fileSystem("/Library/Application Support/Jokes/")
{
    try
    {
        randSystem = new RandSelect<std::string>
                                   (fileSystem.getAllFileContents("%\n"));
    }
    catch (std::ifstream::failure)
    {
        NSWindowController * errorWindowControl = [[NSWindowController alloc] 
                                        initWithWindowNibName:@"ErrorWindow"];
        [errorWindowControl showWindow: nil];
    }
}

构造函数的目的是将目录的内容加载到字符串中。我尝试做的是在文件无法打开时显示错误窗口。

ErrorWindow.nib有一个单独的窗口,其中有一个OK按钮和一个NSTextView的错误,我在笔尖中设置了NSWindowController并将其连接到窗口。

我唯一的链接是大多数示例都显示此[errorWindowControl showWindow: self]; 而不是showWindow: nil,但因为这是一个C ++构造函数,我没有selfthis不起作用。

如果重要,则从awakeFromNib的主要MainMenu.nib的{​​{1}}方法调用此构造函数。

由于

1 个答案:

答案 0 :(得分:3)

接近Cocoa有点奇怪的方法。我鼓励您退后一步,学习Objective-C,然后在您拥有的任何后备存储或模型层的基础上,使用基于Objective-C的Cocoa UI层编写应用程序。

在任何情况下,该代码都没有特别的错误(除了奇怪的设计)。

要检查的第一件事是-initWithWindowNibName:的返回值。 errorWindowControl实际上是非零吗?如果它为零,则NIB无法加载。

你是如何编写Cocoa应用程序的?我希望使用Xcode的标准应用程序包?

此外,您不应该将路径硬编码到/ Library / Application Support /。实际上,您的应用程序不应该使用该目录作为唯一的存储位置;许多用户将无权访问该目录,并且无法在没有管理员访问权限的情况下安装您的应用程序。