我是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是什么?
赖
答案 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