创建NSWindow的问题

时间:2010-08-14 20:20:15

标签: objective-c cocoa nswindow

我是Cocoa的新手,我只是尝试以编程方式创建一个窗口(不使用Interface Builder)。

我在Xcode中启动一个新的Cocoa应用程序,然后从Interface Builder中的nib文件中删除该窗口,将其替换为我自己的窗口。

在main函数中,我添加了代码:

NSWindow* myWindow; 

myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300)
  styleMask:NSTitledWindowMask
  backing:NSBackingStoreBuffered
  defer:NO];

当我尝试构建并运行应用程序时,收到以下错误消息:

  

错误(1002)创建CGSWindow

为什么会这样?顺便说一句,CGSWindow是什么?

4 个答案:

答案 0 :(得分:2)

您可能还没有连接到窗口服务器。这是NSApplication的工作,所以请先尝试创建shared application

如果这没有帮助,我将使用我常用的应用程序布局:为自定义控制器创建一个NSObject子类,从应用程序委托的applicationWillFinishLaunching:实例化它并在{{1}中释放它,并让您的自定义控制器的applicationWillTerminate:方法创建窗口。应用程序对象肯定会在这一点上运行(因为init除了调用main之外什么都不做,它会获取/创建共享应用程序并告诉它运行),所以你肯定应该连接到窗口服务器,因此能够创建窗口。

答案 1 :(得分:0)

将您编写的代码从App Delegate实施文件 -

移至以下方法
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
 // Insert code here to initialize your application 

 NSWindow* myWindow; 

 myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300)
             styleMask:NSTitledWindowMask
            backing:NSBackingStoreBuffered
              defer:NO];
}

它应该可以完美地加载你的窗口。

值得注意的是,在main函数中创建任何与UI相关的对象并不安全,也不是一个好习惯。

答案 2 :(得分:0)

您可能希望在Cocoa应用程序中的main()函数中拥有的唯一代码是由XCode自动为您创建的(如果您正在使用它)。

我建议您将所需的代码添加到applicationDelegate的-applicationDidFinishLaunching:method

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification {
    myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300)
        styleMask:NSTitledWindowMask
        backing:NSBackingStoreBuffered
        defer:NO];;
}

答案 3 :(得分:-1)

如果您想从头开始显示一个完全空的窗口,这就是您需要的所有代码:

//if you used a template this will be already in the file:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoReleasePool alloc] init];
    int retval=UIApplicationMain(argc,argv,nil,@"SimpleWindowAppDelegate");
    [pool release];
    return retVal;
}

@implementation SimpleWindowAppDelegate : NSObject <UIApplicationDelegate>
-(void) applicationDidFinishLaunching:(UIApplication *)application
{
    UIWindow *window=[[UIWindow alloc] initWithFrame:[[UIDevice mainScreen] bounds]];
    //You could create views and add them here:
    //UIView *myView=[[UIView alloc] initWithFrane:CGRectMake(0,0,50,50)];
    //[window addSubView:myView];
    //[myView release];
    [window makeKeyAndVisible];
}
@end