我很难在Cocoa接口中切换表单。从我的初始表单及其委托,我可以隐藏初始窗口然后加载并显示第二个窗口,其中包含所有属性。这工作正常......唉,在尝试返回初始窗口时,我隐藏了第二个窗口,并且初始化没有返回......
这是我的.h和.m的初始形式和formTwo ......
·H
#import <Cocoa/Cocoa.h>
@class frmTwoDelegate;
@interface AppDelegate : NSObject {
@private
frmTwoDelegate *_frmTwo;
}
@property (assign) IBOutlet NSWindow *window;
- (IBAction)BtnSwitchAction:(id)sender;
@end
的.m
#import "AppDelegate.h"
#import "frmTwoDelegate.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
...
}
- (IBAction)BtnSwitchAction:(id)sender {
if (!_frmTwo) {
_frmTwo = [[DecriptDelegate alloc] initWithWindowNibName:@"frmTwo"];
[_frmTwo setFrmStart:self];
}
[_frmTwo showWindow:sender];
[_window setIsVisible:NO];
}
@end
这是.h和.m for frmTwo
·H
#import <Cocoa/Cocoa.h>
@class AppDelegate;
@interface frmTwo : NSWindowController{
@private
AppDelegate *frmStart;
__unsafe_unretained NSTextView *_TxtView;
}
@property (retain) AppDelegate *frmStart;
@property (assign) IBOutlet NSWindow *frmTwo;
@property (unsafe_unretained) IBOutlet NSTextView *TxtView;
- (IBAction)BtnOpenActionPreformed:(id)sender;
- (IBAction)BtnBackActionPreformed:(id)sender;
@end
的.m
#import "frmTwo.h"
#import "AppDelegate.h"
@implementation frmTwo
@synthesize frmStart;
- (id)initWithWindow:(NSWindow *)window
{
...
}
- (void)windowDidLoad
{
...
}
- (IBAction)BtnOpenActionPreformed:(id)sender
{
...
}
- (IBAction)BtnBackActionPreformed:(id)sender {
[frmStart ShowWindow];
[_frmTwo setIsVisible:NO];
}
@end
答案 0 :(得分:0)
这是一种更简单的方法来实现您的目标。我不会写.h定义,只是推断出变量代表的名称。
- (IBAction)BtnSwitchAction:(id)sender {
if (!_formTwo) {
_formTwo = [[DecriptDelegate alloc] initWithWindowNibName:@"frmTwo"];
[_formTwo setFrmStart:self];
}
if(_formOne.isVisible) {
[_window close];
[_formTwo showWindow:sender];
} else if(_formTwo.isVisible) {
[_formTwo close];
[_window showWindow:sender];
}
}
在您的笔尖中,确保两个窗口都取消选中“Release when closed
”复选框,以便在您关闭时不会释放窗口。在第二个FormTwo窗口控制器中,您应该使用BtnSwitchAction
方法调用BtnBackActionPreformed
。
我知道有很多方法可以将窗口切换代码连接到后退按钮,但我建议在AppDelegate上使用一种方法来处理所有窗口切换逻辑,而不是从BtnBackActionPreformed
操作其他窗口。该控制器和方法不应该知道其他窗口的细节,它应该告诉AppDelegate进行切换。