2013-10-06 5 views
0

У меня есть приложение, в котором окно должно быть открыто и закрыто при нажатии или выключении флажка в отдельном окне. Я могу открыть его, но не могу его закрыть. Я определяю NSWindow в windowControllerObject и пытаюсь закрыть NSWindow. Соответствующий код:Не удается закрыть окно - почему?

buttonController.h

@interface buttonController : NSWindowController 
{ 
NSButton *showAnswerBox; 
infoWindowController *answerWindowController; 
} 
- (IBAction)showAnswer:(id)sender; 
@end 

buttonController.m

- (IBAction) showAnswer:(id) sender 
{ 
    if ([sender state] == NSOnState) { 
     if (!answerWindowController) { 
      answerWindowController = [[infoWindowController alloc] init]; 
      } 
     [answerWindowController showWindow:self]; 
     } 
    else { 
     [answerWindowController hideWindow]; 
    } 
} 

infoWindowController.h:

@interface infoWindowController : NSWindowController { 

IBOutlet NSWindow * infoWindow; 
} 
- (id) init; 
- (NSWindow *) window; 
- (void) hideWindow; 
- (void) tsSetTitle: (NSString *) displayName; 

@end 

И в infoWindowController.m:

- (NSWindow *) window 
{ 
    return infoWindow; 
} 

- (void) hideWindow 
{ 
    [[self window] close]; 
} 

Окно открывается, но оно не будет закрываться. Я попробовал несколько вариантов, в том числе orderOut на infoWindowController. Я уверен, что мне не хватает чего-то глупого - что это?

В IB, единственный способ, с помощью которого я могу открыть окна, - это если «Открыть при запуске» проверено - не должен ли я открывать их программно без этого?

+0

Выполнена любая отладка? Методы называются? Переменные действительны? – Wain

+0

Вы намеренно переопределяете свойство окна своей собственной реализацией? Что происходит для [infoWindow close] в вашем методе hideWindow –

+0

Изменили свой код. Пожалуйста, проверьте –

ответ

4

NSWindowController уже определяет a window. Вы действительно переопределили получателя этого свойства, выполнив свой собственный метод -window. Однако установщик по-прежнему является унаследованной версией.

Итак, предположим, что вы подключили выход контроллера window к окну в NIB, вызывается унаследованный сеттер. Это позволяет унаследованной реализации -showWindow: работать, чтобы показать окно. Но ваш метод -window вернет nil, потому что унаследованный сеттер не задает переменную экземпляра infoWindow.

Избавиться от вашего отдельного infoWindow объекта недвижимости и геттера. Просто используйте унаследованное свойство window и его аксессоры.

+0

Ken: Я удалил этот материал, и он все еще не работает.Проблема может заключаться в следующем комментарии: «Итак, предположим, что вы подключили выходное отверстие окна контроллера к окну в NIB». Я этого не делал. Нужно ли создавать окно в интерфейсе infoWindowController? 'Окно IBOutlet' Как оно реализовано? –

+0

Кен, я, наконец, понял это. Я добавил «окно» к владельцу файла, введите NSWindow и элемент управления перетащил его в интересующее окно. Спасибо вам и всем. –

+0

Обычно вы устанавливаете класс Владельца Файла в свой собственный подкласс 'NSWindowController'. Затем IB знает о унаследованной «оконной» розетке, и вы можете ее подключить. Непосредственно сообщая IB, что у Владельца Файла есть «окно», также работает, но вы, вероятно, хотите, чтобы он знал класс вашего контроллера. Таким образом, по мере добавления дополнительных свойств или, возможно, действий, они будут автоматически доступны. Я рекомендую эту [статью в блоге] (http://www.mikeash.com/pyblog/friday-qa-2013-04-05-windows-and-window-controllers.html). –

0

Если вы используете NSWindowController, лучше использовать его close метод:

- (void) hideWindow 
{ 
    [self close]; 
} 

или просто:

[answerWindowController close]; 

Но ваш код также справедливо, просто убедитесь, что ваш [answerWindowController window] не равен нулю. Если вы загружаете свое окно из xib, вы должны инициализировать ваш оконный контроллер с именем этого xib: answerWindowController = [[AnswerWindowControllerClass alloc] initWithWindowNibName:@"YOUR WINDOW XIB NAME"];.

Также проверьте, что «Видимый при запуске» не установлен для вашего окна (кажется, что это не так).

Смежные вопросы