2013-05-23 7 views
0

У меня очень сложное переключение между формами в интерфейсах Cocoa. Из моей начальной формы и ее делегата я могу скрыть начальное окно, затем загрузить и отобразить второе окно со всеми его свойствами. Это работает ... Увы, при попытке вернуться в начальное окно, я скрываю второе окно, а начальное не возвращается ...Переключение между окнами Интерфейсы XCode

Вот мои .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 

Вот .h и .m для 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

Перед тем как получить ответ, есть пара проблем с отправленным кодом. в методе BtnBackActionPreformed вы ссылаетесь на _frmTwo, который нигде не определен. setIsVisible также не является методом NSWindow или NSWindowController. Поэтому я не уверен, что вы там делаете. Кроме того, это запутывает вызов делегатов классов, когда они наследуют NSWindowController. FormTwoController будет более «Cocoa», чтобы назвать класс вашего контроллера окон. –

ответ

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 сделать этот переключатель.