Показаны сообщения с ярлыком Objective-C. Показать все сообщения
Показаны сообщения с ярлыком Objective-C. Показать все сообщения

воскресенье, 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

понедельник, 24 июня 2013 г.

Objective-C: Генерация случайного числа

Xcode: Version 4.6.3

Допустим нам надо получить случайное число в каком-то диапазоне положительных чисел, к примеру любое случайное число от 0 до 1, воспользуемся решением ниже:

// Метод генерации случайных чисел от начального положительного значения до конечного положительного значения
// Начальное положительного значение и конечное положительное значение входят в этот диапазон
- (NSUInteger) generate: (unsigned long) initialValue generate: (unsigned long) finalValue {
  
    // Возвращаем генерированное число
    return initialValue + (arc4random() % finalValue);
  

Проверка:

int a = 0, b = 1;

long v = [self generate:a generate: (b - a) + 1];

NSLog(@"Случайное число от %d до %d = %lu", a, b, v);

Objective-C: Женская русская фамилия из мужской

Xcode: Version 4.6.3 

Преобразование женской фамилии из мужской, подразумевает замену окончаний в слове. То есть действуют простые правила, если мужская фамилия заканчивается на -ов, -ев, -ин, -ёв то в конце добавляется -а. Если окончание на -ий, -ый, -ой добавляется -ая. Все остальные фамилии остаются как есть.

Набросаем метод:

// Метод преобразования русской женской фамилии из мужской русской фамилии
// От мужских русских фамилий на -ов, -ев, -ин, -ёв добавляется -а
// От мужских русских фамилий на -ий, -ый, -ой добавляется -ая
// Остальные остаются как есть
- (NSString*) conversionHumanWomanFamilyRu: (NSString*) humanManFamilyRu {
   
    // Забираем от строки(мужской фамилии) два последних символа
  NSString *endTwoCharactersHumanManFamilyRu = [humanManFamilyRu substringFromIndex:([humanManFamilyRu length] - 2)];
   
    //NSLog(@"String:%@, two last character of the string:%@, string length:%lu", humanManFamilyRu, endTwoCharactersHumanManFamilyRu, ([humanManFamilyRu length] - 2));
   
    // Сравниваем окончание
    if ( [endTwoCharactersHumanManFamilyRu isEqual: @"ов"] || [endTwoCharactersHumanManFamilyRu isEqual: @"ев"] || [endTwoCharactersHumanManFamilyRu isEqual: @"ёв"] || [endTwoCharactersHumanManFamilyRu isEqual: @"ин"]) {
          
        humanManFamilyRu = [humanManFamilyRu stringByAppendingString:@"а"];
       
        // NSLog(@"%@",humanManFamilyRu);
       
    } else {
       
        if ([endTwoCharactersHumanManFamilyRu isEqual: @"ий"] || [endTwoCharactersHumanManFamilyRu isEqual: @"ый"] || [endTwoCharactersHumanManFamilyRu isEqual: @"ой"]) {
           
            humanManFamilyRu = [humanManFamilyRu stringByReplacingCharactersInRange: NSMakeRange(([humanManFamilyRu length]-2),2) withString:@"ая" ];
           
            // NSLog(@"%@",humanManFamilyRu);
           
        }
       
    }    
    // Возвращаем женскую фамилию
    return humanManFamilyRu;
}

И наконец производим правильность работы метода:

NSString *humanWomanFamilyRu =[self conversionHumanWomanFamilyRu:@"Ангарский"];

NSLog(@"Русская женская фамилия:%@", humanWomanFamilyRu);