Ваша основная проблема в том, что каждое окно предполагает, что создание другого - это его собственная работа. У каждого есть ивар для другого, но нет внешнего доступа к нему - через свойство или как IBOutlet
или что-то еще - поэтому он всегда начинается с nil
, и вместо повторного использования создается новая копия старый.
Есть множество способов обойти это. Вероятно, проще всего было бы создать оба окна в Интерфейсном Разработчике и связать их там, сделав ivars IBOutlet
. Тогда вы знаете, что вам вообще не нужно создавать их в коде.
Однако, чисто на основе инерции, вот альтернатива, которая ближе к тому, что у вас уже есть. Обратите внимание, что для простоты я предположил, что mainWindow
всегда существует первым. Если нет, вам придется дублировать процесс наоборот.
//MainWindow.h
@class DetailWindow;
@interface MainWindow : NSWindowController
{
IBOutlet NSButton *btn1;
DetailWindow *detailwindow;
}
@property (nonatomic, retain) NSButton *btn1;
- (IBAction)btn1Event:(id)sender;
//MainWindow.m
@implementation MainWindow
@synthesize btn1;
- (IBAction)btn1Event:(id)sender
{
if (!detailwindow)
{
detailwindow = [[DetailWindow alloc] initWithWindowNibName:@"DetailWindow"];
// having created the other window, give it a reference back to this one
detailWindow.mainWindow = self;
}
[detailwindow showWindow:self];
}
@end
//DetailWindow.h
@class MainWindow;
@interface DetailWindow : NSWindowController
{
IBOutlet NSButton *backbtn;
MainWindow *mainwindow;
}
@property (nonatomic, retain) NSButton *backbtn;
// allow the main window to be set from outside
@property (nonatomic, retain) MainWindow *mainWindow;
- (IBAction)back:(id)sender;
//DetailWindow.m
@implementation DetailWindow
@synthesize backbtn;
@synthesize mainWindow;
- (IBAction)back:(id)sender
{
// no window creation on the way back
NSAssert(mainWindow, "mainWindow not set!");
[mainwindow showWindow:self];
}
@end
Не проверено, поэтому применяются обычные предостережения.