2013-06-21 3 views
1

Я не понимаю, что здесь происходит. У меня есть кнопка проводную до ниже действия в AppDelegate:Weird NSLog: NSLog отображает окно контроллера окна

- (IBAction)openWindow:(id)sender { 
    self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"]; 
} 

На нажатие кнопки ничего не происходит (как и ожидалось), но когда я изменить код для (добавить NSLog())

- (IBAction)openWindow:(id)sender { 
    self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"]; 
    NSLog(@"%@",self.winCon.window); 
} 

Появится окно «NewWindow». Почему это происходит? Также NSLog печатает (null) в консоли.

(В ВЛАДЕЛЬЦА «NewWindow» XIB файла является NSObject и я не подключен на ссылку окна. Так что я ожидал, что журнал для печати null, но окно отображается был сюрприз)

Другое дело, когда я использую:

- (IBAction)openWindow:(id)sender { 
    [NSBundle loadNibNamed:@"NewWindow" owner:self.winCon]; 
} 

при нажатии кнопки открывается окно. Почему это происходит? Не загружает нить и не отображает оконные процессы. Не следует ли мне называть showWindow: или makeKeyAndOrderFront: для отображения окна?

Когда я прочитал определенную часть яблока Docs в window programming guide:

Открытие окно, то есть, что делает окно видимым, обычно осуществляется путем размещения окна в список окна приложения с помощью вызывая один из методов makeKeyAndOrderFront :, orderFront :, и т. д., в NSWindow и т. д. Кроме того, с определенными битами, установленными в Interface Builder, окно отображается, когда файл nib загружается в в некоторых случаях.

Я думаю, это причина для loadNibNamed:.., чтобы открыть окно. Но каковы эти «биты, установленные в Interface Builder». Где я могу получить информацию об этом? (Также я мог предотвратить открытие окна в приведенном выше случае, когда я сниму «видимый при запуске» свойство окна. Это поможет, если еще немного объяснит, что это свойство делает.) Спасибо.

Примечание: Я знаю, как инициализировать ниб с использованием подкласса NSWindowController и выполнить правильную проводку в xib, но мне просто интересно об этом.

ответ

0

Чтобы ответить на ваш первый вопрос, когда вы пишете NSLog(@"%@",self.winCon.window); вы фактически посылающее сообщение для экземпляра контроллера окна winCon, чтобы отобразить его окно, а затем отправить его дополнительные description сообщений для вывода строку, которая будет отображаться в консоли , Написанный в стандартном синтаксисе передачи сообщений (неточечная нотация) и используя «% s» в строке формата, вы делаете это: NSLog(@"%s",[[[self winCon] window] description]. Согласно documentation, оконный метод возвращает экземпляр окна и пытается загрузить окно, если оно еще не было отображено.

loadNibNamed:owner: Метод NSBundle следует использовать только в том случае, если вы не используете оконный контроллер. Загрузка файла nib и отображение окна - это два отдельных действия.Если вы еще этого не сделали, вы должны прочитать наполнитель владельца файла и как файлы xib архивируются в файлы nib. Это, как говорится, ваш метод ShowWindow должен выглядеть следующим образом (хотя вы действительно должны наследоваться NSWindowController и уже он инициализируется - дайте мне знать, если это не имеет смысла):

- (IBAction)openWindow:(id)sender { 
    self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"]; 
    [self.winCon showWindow]; 
} 
+0

Спасибо за информацию о окне метод, но загрузка окна и отображение окон разные? Также почему состояние журнала возвращает null. И в отношении loadNibNamed: owner: тот факт, что загрузочное окно и окно отображения являются отдельными действиями, является причиной моих сомнений. Зачем нужно вызывать окно «loadNibNamed: owner:». Я добавлю больше деталей к вопросу, чтобы сделать его более понятным. – Rakesh

+0

Вы имели в виду 'showWindow:' я думаю. – Rakesh

+0

В документах все они загружают окно, но ничего не говорят о отображении окна. – Rakesh