2011-11-17 5 views
1

Я ищу простейший пример, который показывает одно окно, открывающее другое окно, а затем закрывающее его.Какао: Создайте и закройте одно окно от другого

Место, где я, похоже, застревает, - это NIB и то, как должны быть подключены розетки. Я могу легко создать окно; закрытие представляет собой вызов.

Любые советы очень ценятся!

Я прикрепляю свой код ниже. Я думаю, что я пытаюсь сделать это просто, но это не сработает. Благодаря Фрэнсису я могу теперь открыть окно и закрыть его, но как только я попытаюсь открыть его снова, приложение выйдет из строя (EXC_BAD_ACCESS). Я уверен, что это связано с моим плохим пониманием отношения NIB к классам. В большинстве языков мне просто нужно создать экземпляр нового экземпляра окна, а затем закрыть его.

У меня есть 2 окна в MainMenu.xib. (Я бы предпочел иметь окно в отдельном NIB, но это создает другие проблемы!) AppDelegate имеет 2 выхода, для окна (оригинал) и otherWindow (созданное 2-е окно).

Первое окно имеет 2 кнопки: «Открыть окно » и «Закрыть окно» с подключением к 2 методов в коде.

Код:

MyTestAppDelegate.h

#import <Cocoa/Cocoa.h> 

@interface MyTestAppDelegate : NSObject <NSApplicationDelegate> { 
    NSWindow *window; 
    NSWindow *otherWindow; 
} 

@property (assign) IBOutlet NSWindow *window; 
@property (assign) IBOutlet NSWindow *otherWindow; 

- (IBAction)openOtherWindow:(id)sender; 
- (IBAction)closeOtherWindow:(id)sender; 

@end 

MyTestAppDelegate.c

#import "MyTestAppDelegate.h" 

@implementation MyTestAppDelegate 

@synthesize window; 
@synthesize otherWindow; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 
} 

- (IBAction)openOtherWindow:(id)sender 
{ 
    [otherWindow makeKeyAndOrderFront:sender]; 
} 

- (IBAction)closeOtherWindow:(id)sender 
{ 
    [otherWindow close]; 
} 
@end 
+0

Очень важная деталь: это приложение для Mac, а не приложение для iOS. –

ответ

7

В основном, в вашем СИБ вы создаете различные окна, добавлять кнопки, текстовые поля и т.д. Тогда вы добавляете настраиваемый объект, который действует как «контроллер», который отправляет и принимает сообщения в окна и из разных элементов управления и из них. В простом проекте вы можете использовать автоматически созданный объект AppDelegate для управления вашими окнами, для больших проектов вам нужен отдельный объект для обработки логики, который может быть экземпляром NSObject или NSWindowController, в зависимости от ваших потребностей.

Windows может быть настроена как «Видимая при запуске», которая открывается, когда приложение запускается. Вы также можете открыть их вручную, создав ссылки IBOutlet в файлах заголовков и подключив их в NIB. Чтобы показать окна, вы отправляете им сообщение makeKeyAndOrderFront:. Чтобы закрыть их, вы отправляете им метод close.

Чтобы ответить на открытие/закрытие окна, вы назначаете свой объект контроллера как «делегат» окон, что означает, что он получит сообщения из окон, которые перечислены в документации по протоколу NSWindowDelegate. Поэтому, если вы хотите открыть окно в ответ на закрытие другого окна, вы будете слушать сообщение windowWillClose: и открыть другое окно, и наоборот.

Это довольно простой материал, поэтому я рекомендую вам прочитать книгу Hillegass или просмотреть некоторые из tutorialsavailableonline.

EDIT:

Ты приложение сбой, потому что у вас есть otherWindow набор для «Release при закрытии» Так как вы в памяти, управление окружающей средой, и ничего не сохраняя окно, в следующий раз, вы пытаетесь чтобы открыть его, он уже освобожден. Решение состоит в том, чтобы снять флажок «Release When Closed» в файле NIB. Обратите внимание, что вы также можете подключить действия своей кнопки к makeKeyAndOrderFront: и performClose: методам другого самого окна непосредственно в NIB.

+0

Спасибо Фрэнсис. Я согласен с этим, но я до сих пор не понял, как работает NIB. Когда я попытался использовать 2 NIB, я обнаружил, что вызов закрытия с контроллера внутри NIB закроет окно должным образом, но с использованием ссылки извне (например, из исходного окна) будет отображаться нулевое окно. Я редактировал свой вопрос с точным кодом. Я искал много обучающих сайтов и не могу найти самый простой пример, который я пытаюсь создать. –

+0

Большое спасибо Фрэнсис! Именно то, что мне нужно. Все еще пытаюсь получить зависание файлов NIB. –

0

Создайте новый проект с помощью "UINavigationController" шаблон в XCode 4.1 или «Мастер-деталь» ication "в XCode 4.2 и посмотреть, как там работает материал.

Если вы не заинтересованы в обучении путем анализа шаблона XCode посмотреть на следующем уроке: http://www.iosdevnotes.com/2011/03/uinavigationcontroller-tutorial/

+2

Упоминание «окон» означает, что плакат не имеет отношения к iOS. –

+0

Большое спасибо за ответ. Возможно, мне следовало бы уточнить, что то, что я ищу, - это приложение Mac, а не приложение iOS. –

+0

Сказав это - я все равно буду смотреть на примеры, если есть код, похожий на то, что я пытаюсь сделать. –

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

  • Нет связанных вопросов^_^