проблемы с созданием NSWindow - PullRequest
4 голосов
/ 15 августа 2010

Я новичок в Какао, и я просто экспериментирую с созданием окна программно (без использования Interface Builder).

Я запускаю новое приложение какао в Xcode, затем удаляю окно из файла пера в Interface Builder, чтобы заменить его своим собственным.

В основную функцию добавляю код:

NSWindow* myWindow; 

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

Когда я пытаюсь собрать и запустить приложение, я получаю следующее сообщение об ошибке:

Ошибка (1002) при создании CGSWindow

Почему это происходит ??? Кстати, что такое CGSWindow?

Rainer

Ответы [ 4 ]

2 голосов
/ 15 августа 2010

Возможно, вы еще не подключены к серверу окон. Это задача NSApplication, поэтому попробуйте сначала создать общее приложение .

Если это не поможет, я просто рассмотрю свой обычный макет приложения: создайте подкласс NSObject для пользовательского контроллера, создайте его экземпляр из applicationWillFinishLaunching: вашего делегата приложения и выпустите его в applicationWillTerminate: и метод init вашего пользовательского контроллера создает окно. К этому моменту объект приложения определенно будет запущен (так как main ничего не делает, кроме как вызывает NSApplicationMain, который получает / создает совместно используемое приложение и сообщает ему о запуске), поэтому у вас обязательно должно быть соединение с оконным сервером и т. Д. быть в состоянии создать окно.

0 голосов
/ 11 сентября 2010

Единственный код, который вы, вероятно, захотите иметь в своей функции main () в приложении Какао, автоматически создается для вас XCode (если вы его используете).код, который вы хотите добавить в приложение -Delegate -applicationDidFinishLaunching: метод

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification {
    myWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(10,100,400,300)
        styleMask:NSTitledWindowMask
        backing:NSBackingStoreBuffered
        defer:NO];;
}
0 голосов
/ 29 августа 2010

Если вы хотите отобразить полностью пустое окно с нуля, это весь код, который вам понадобится:

//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
0 голосов
/ 22 августа 2010

Переместите код, который вы написали в следующий метод, из вашего файла реализации 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.

...