0

我正在制作一个简单的 Mac 应用程序,我想在其中切换窗口。
我有两个 NSWindowController 类MainWindowDetailWindow

我正在使用这段代码:

主窗口类:

//MainWindow.h
@class DetailWindow;
@interface MainWindow : NSWindowController{

    IBOutlet NSButton *btn1;
    DetailWindow *detailwindow;
}
@property (nonatomic, retain) IBOutlet NSButton *btn1;
- (IBAction)btn1Event:(id)sender;

//MainWindow.m

@implementation MainWindow
@synthesize btn1;

- (IBAction)btn1Event:(id)sender {

if (!detailwindow) {
    detailwindow = [[DetailWindow alloc] initWithWindowNibName:@"DetailWindow"];

}
    [detailwindow showWindow:self];
}
@end

细节窗口类:

//DetailWindow.h
@class MainWindow;
@interface DetailWindow : NSWindowController{

    IBOutlet NSButton *backbtn;
    MainWindow *mainwindow;
}
@property (nonatomic, retain) IBOutlet NSButton *backbtn;
- (IBAction)back:(id)sender;

//DetailWindow.m

@implementation DetailWindow
@synthesize backbtn;

- (IBAction)back:(id)sender {

if (!mainwindow) {
    mainwindow = [[MainWindow alloc] initWithWindowNibName:@"MainWindow"];

}
    [mainwindow showWindow:self];
}
@end

现在的问题是当我点击backbtn on DetaiWindow它会打开一个新的MainWindow.
所以我有两个MainWindow在屏幕上。
当我点击 backbtn 时,我只想要前面的主窗口。

有什么帮助吗??

谢谢..!!

4

2 回答 2

1

您的基本问题是每个窗口都假设创建另一个窗口是它自己的工作。每个都有一个 ivar,但没有外部访问它——通过属性或作为一个IBOutlet或其他任何东西——所以它总是以 开头nil,并且创建一个新副本而不是重用旧副本。

有很多方法可以解决这个问题。可能最简单的方法是在 Interface Builder 中创建两个窗口并将它们链接到那里,制作 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

未经测试,因此通常需要注意。

于 2011-09-20T09:46:20.947 回答
-1

您必须在主窗口上使用 self 对象调用 orderFront: 方法。

为此,您必须找到对主窗口的引用。一种方法是:

[NSApp mainWindow];

这个调用将返回一个指向主窗口的指针(如果你做错了,你可能不得不循环通过 [NSApp windows] 数组来搜索你的主窗口)。

当您找到窗口时,通过执行向它发送 orderFront 消息(假设上面的代码返回正确的窗口,如前所述)。

[[NSApp mainWindow] orderFront:self];

并且窗口应该神奇地排列在前面。

于 2011-09-15T17:14:51.450 回答