Xcode: Version 4.6.3
Для начала создадим новый проект в xcode, с названием Example. Сразу добавим в него два класса NSViewController (File - New - File → Objective-C class) с именами:
FirstViewController и SecondViewController каждый с собственными xib-ами, галочка «With XIB for user interfasce» соответственно должна быть поставлена.
В
SecondViewController.xib и
FirstViewController.xib на слой (Custom View) добавляем кнопку и текстовое поле, для визуализации. Должно получиться конструкция показанная на скриншоте ниже. В
MainMenu.xib две кнопки и новый слой 0, а уже на него текстовое поле.
В
MainMenu.xib из правой колонки перетащим два контролера типа «
ViewController».
Созданные контролеры привяжем к конкретным классам:
После подготовительной работы опишем наши будущие действия. Так по кнопке 1 показываем слой 1 *(скрывая слой 2), по кнопке 2 показываем слой 2 *(скрывая при этом слой 1).
AppDelegate.h
#import <Cocoa/Cocoa.h>
@class FirstViewController;
@class SecondViewController;
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSView *view0;
@property (unsafe_unretained) IBOutlet FirstViewController *firstViewController;
@property (unsafe_unretained) IBOutlet SecondViewController *secondViewController;
- (IBAction)button1:(id)sender;
- (IBAction)button2:(id)sender;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
}
- (IBAction)button1:(id)sender {
NSLog(@"Кнопка 1 нажата");
[[_secondViewController view]removeFromSuperview];
[_view0 addSubview:[_firstViewController view]];
[[_firstViewController view] setFrame:[_view0 bounds]];
}
- (IBAction)button2:(id)sender {
NSLog(@"Кнопка 2 нажата");
[[_firstViewController view]removeFromSuperview];
[_view0 addSubview:[_secondViewController view]];
[[_secondViewController view] setFrame:[_view0 bounds]];
}
@end
Усложним задачу по клику кнопки слоя First скрыть слой First и показать слой Second, а по клику кнопки слоя Second скрыть слой Second и показать слой First. По сути зеркальные действия.
FirstViewController.h
#import <Cocoa/Cocoa.h>
@class SecondViewController;
@interface FirstViewController : NSViewController
@property (weak) IBOutlet NSView *view0;
@property (strong) IBOutlet NSView *firstView;
@property (unsafe_unretained) IBOutlet SecondViewController *secondViewController;
- (IBAction)buttonFirst:(id)sender;
@end
FirstViewController.m
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Initialization code here.
}
return self;
}
- (IBAction)buttonFirst:(id)sender {
NSLog(@"Кнопка buttonFirst нажата");
[_firstView removeFromSuperview];
[[_secondViewController view] removeFromSuperview];
[_view0 addSubview:[_secondViewController view]];
[[_secondViewController view] setFrame:[_view0 bounds]];
}
@end
SecondViewController.h
#import <Cocoa/Cocoa.h>
@class FirstViewController;
@interface SecondViewController : NSViewController
@property (weak) IBOutlet NSView *view0;
@property (strong) IBOutlet NSView *secondView;
@property (unsafe_unretained) IBOutlet FirstViewController *firstViewController;
- (IBAction)buttonSecond:(id)sender;
@end
SecondViewController.m
#import "SecondViewController.h"
#import "FirstViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Initialization code here.
}
return self;
}
- (IBAction)buttonSecond:(id)sender {
NSLog(@"Кнопка buttonSecond нажата");
[_secondView removeFromSuperview];
[[_firstViewController view] removeFromSuperview];
[_view0 addSubview:[_firstViewController view]];
[[_firstViewController view] setFrame:[_view0 bounds]];}
@end