2011-01-08 3 views
1

У меня есть этот код для работы на моем приложение запуска:NSWindow Исчезает

NSRect rect = NSMakeRect(0, 0, 200, 50); //The location of the window 
    NSWindow *win = [[NSWindow alloc] initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 
    [win setOpaque:NO]; 

    [win setLevel:NSFloatingWindowLevel]; 
    //[win setBackgroundColor:[NSColor clearColor]]; 

    //or 

    NSView *myView = [[NSView alloc] initWithFrame: NSMakeRect(0, 0, 200, 50)]; 
    NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(10, 5, 180, 40)]; 

    [myView addSubview: myButton]; 
    [win setHidesOnDeactivate:NO]; 

    [win setContentView: myView]; 

    [win orderFront: nil]; 

Он работает, как ожидалось (отображает кнопку в левом нижнем углу экрана) в течение секунды, затем исчезает , Почему он исчезает? Управление памятью или что-то еще, и как это исправить?

ответ

6

Во-первых, чрезвычайно сложно создавать пользовательский интерфейс, не просто используя Interface Builder. Может быть сделано, и есть несколько причин, чтобы сделать это, но их довольно мало и далеко.

Далее, этого кода сам по себе недостаточно, чтобы сказать, что пошло не так. Создание пользовательского интерфейса программно вызывает целый ряд вопросов; gc или нет? ... как настроен ваш цикл запуска? ... у вас есть правильно настроенная оболочка приложения?

Как сказал Абизем, наиболее очевидным было бы предположение, что у вас включен GC, и вы нигде, прямо или косвенно не привязали окно к какой-либо глобальной переменной. Он «просто работает» в стандартном приложении Cocoa, потому что экземпляры NSWindow внедряются через инфраструктуру приложений Cocoa (в частности, меню Windows).

+0

Да, это был GC. Я просто создаю пользовательский интерфейс программно прямо сейчас, потому что я не могу понять, как связать его с IB. Я просто хотел, чтобы плавающее окно работало, прежде чем возиться с новым кодом, чтобы загрузить документ IB вместо простого окна с кнопкой. –

+0

Прохладный-- рад, что вы прошли мимо этой проблемы. Я понимаю логику этого подхода, но я бы рекомендовал вам отступить и выяснить, как использовать IB. Это намного проще, чем его кодирование; вся документация, примеры и рабочий процесс построены вокруг использования IB. Как правило, люди изучают конструкцию пользовательского интерфейса, отличного от IB, после освоения IB в качестве передовой темы. – bbum

4

Вы работаете с Garbage Collection?

У вас есть iVar, который держится до win? Может быть, из-под вас вывоз мусора.