воскресенье, 14 июля 2013 г.

Objective-C: NSViewController - простой пример управления слоями или видами (views)

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