2010-08-14 4 views
4

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

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

В основной функции, добавить код:

NSWindow* myWindow; 

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

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

Error (1002) о создании CGSWindow

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

Rainer

ответ

2

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

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

0

Переместить код, который вы написали в следующий метод из файла реализации App Делегат -

- (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]; 
} 

и он должен загрузить окно идеально.

Следует отметить, что это никогда не является безопасным и не является хорошей практикой для создания любых объектов, связанных с UI, в вашей функции main.

-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 
+0

ОП просит конкретно о NSWindow; почему вы предоставляете пример iOS? Кроме того, 'NSApplicationMain()' - в отличие от 'UIApplicationMain()', не позволяет вам передавать свой собственный главный класс и делегат приложения. – lowell

+0

Правда, я смутился, извините – Leg10n

0

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

Я предлагаю вам добавить код, который вы хотите в -applicationDidFinishLaunching вашего applicationDelegate в: метод

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