0

Cocoa インターフェイスでフォームを切り替えるのに非常に苦労しています。最初のフォームとそのデリゲートから、最初のウィンドウを非表示にしてから、すべてのプロパティを含む 2 番目のウィンドウを読み込んで表示できます。これは機能しています...悲しいかな、最初のウィンドウに戻ろうとすると、2番目のウィンドウが非表示になり、最初のウィンドウが返されません...

ここに、初期フォームと formTwo の .h と .m があります...

.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

frmTwo の .h と .m は次のとおりです。

.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
4

1 に答える 1

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」チェックボックスがオフになっていることを確認して、close を呼び出したときにウィンドウが解放されないようにします。2 番目の FormTwo ウィンドウ コントローラーでは、メソッドBtnSwitchActionからを呼び出す必要がありますBtnBackActionPreformed

ウィンドウ切り替えコードを [戻る] ボタンに接続する方法はいくつかあることは知っていますが、AppDelegate の 1 つのメソッドですべてのウィンドウ切り替えロジックを使用することをお勧めしますBtnBackActionPreformed。そのコントローラーとメソッドは、他のウィンドウの詳細を知る必要はありません。AppDelegate に切り替えを行うように指示するだけです。

于 2013-05-24T05:56:08.183 に答える