Какао: создать и закрыть одно окно из другого - PullRequest
1 голос
/ 18 ноября 2011

Я ищу самый простой пример, который показывает, что одно окно открывает другое окно, а затем закрывает его.

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

Любой совет, который высоко ценится!

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

У меня есть 2 окна в MainMenu.xib.(Я бы предпочел, чтобы окно находилось в отдельной NIB, но это создает другие проблемы!) У AppDelegate есть 2 выхода: окно (оригинал) и другое окно (создано 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

Ответы [ 2 ]

7 голосов
/ 18 ноября 2011

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

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

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

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

EDIT:

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

0 голосов
/ 18 ноября 2011

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

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

...