我正在制作一个简单的mac应用程序,我想在其中切换窗口
我有两个NSWindowController类MainWindow
和DetailWindow
我正在使用此代码:
MainWindow类:
//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类:
//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时,我只想在前面的主窗口。
任何帮助??
谢谢.. !!
答案 0 :(得分: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
未经测试,通常需要注意。
答案 1 :(得分:-1)
你必须在主窗口上调用带有self对象的orderFront:方法。
要执行此操作,您必须找到对主窗口的引用。一种方法是:
[NSApp mainWindow];
此调用将返回指向主窗口的指针(如果您执行了不正确的操作,则必须循环浏览[NSApp windows]数组才能搜索主窗口。)
当您找到窗口时,通过执行命令向它发送orderFront消息(假设上面的代码返回正确的窗口,如前所述)。
[[NSApp mainWindow] orderFront:self];
并且窗口应该神奇地排在前面。