【问题标题】:problems with creating an NSWindow创建 NSWindow 的问题
【发布时间】:2010-08-14 20:20:15
【问题描述】:

我是 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];

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

创建 CGSWindow 时出错 (1002)

为什么会这样???顺便问一下,CGSWindow 是什么?

雷纳

【问题讨论】:

    标签: objective-c cocoa nswindow


    【解决方案1】:

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

    如果这没有帮助,我会使用我通常的应用程序布局:为自定义控制器创建一个 NSObject 子类,从应用程序委托的 applicationWillFinishLaunching: 实例化它并在 applicationWillTerminate: 中释放它,然后您的自定义控制器的 init 方法创建窗口。应用程序对象肯定会在此时运行(因为main 只调用NSApplicationMain,它获取/创建共享应用程序并告诉它运行),所以你绝对应该连接到窗口服务器等等能够创建窗口。

    【讨论】:

      【解决方案2】:

      将您编写的代码从您的 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 相关的对象是不安全的,也不是一个好习惯。

      【讨论】:

        【解决方案3】:

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

        我建议你将你想要的代码添加到你的 applicationDelegate 的 -applicationDidFinishLaunching: 方法中

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

        【讨论】:

          【解决方案4】:

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

          //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
          

          【讨论】:

          • OP 专门询问 NSWindow;为什么要提供 iOS 示例?另外,NSApplicationMain() - 与 UIApplicationMain() 不同,不允许您传递自己的主体类和应用程序委托。
          猜你喜欢
          • 1970-01-01
          • 2014-02-23
          • 1970-01-01
          • 1970-01-01
          • 2015-03-17
          • 2012-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多