17 февр. 2014 г.

NSArchiver кодирование объектов

Класс NSArchiver, конкретный подкласс NSCoder, предоставляет способ для кодирования объектов в архитектурно независимый формат, который может храниться в файле. Объект класса NSArchiver сохраняет архивные данные в изменяемый объект данных, объект класса NSMutableData. После кодирования объектов, объект NSArchiver может записать этот изменяемый объект данных непосредственно в файл, или можно использовать эти данные по-другому. Класс NSUnarchiver служит для декодирования объектов из объектов, хранящих данные. В Mac OS X v10.2 и более поздних версиях, NSArchiver и NSUnarchiver были заменены NSKeyedArchiver и NSKeyedUnarchiver.

Методы класса:

Инициализация NSArchiver


Название
Описание
- initForWritingWithMutableData:
Возвращает архиватор, инициализированный для кодирования потока и сведений о версии в указанный объект изменяемых данных.

Архивирование данных

Название
Описание
+ archivedDataWithRootObject:
Возвращает объект данных, содержащий закодированную форму графа объектов для заданного корневого объекта.
+ archiveRootObject:toFile:
Создает временный экземпляр NSArchiver и архивирует граф объектов при помощи кодирования в объект данных и записи результирующего объекта данных в указанный файл.
- encodeRootObject:
Архивирует заданный объект, а также все объекты, к которым он подключен.
- encodeConditionalObject:
Условно архивирует заданный объект.

Получение архивных данных


Название
Описание
- archiverData
Возвращает архивные данные текущего объекта.

Замена классов или объектов


Название
Описание
-classNameEncodedForTrueClassName:
Возвращает имя класса, используемого для архивирования экземпляров класса с правильным заданным именем.
- encodeClassName:intoClassName:
Кодирует заменяющее имя для класса с заданным правильным именем.
- replaceObject:withObject:
Позволяет текущему архиверу закодировать заданный объект так, как будто бы он является другим заданным объектом.

16 февр. 2014 г.

NSAffineTransform аффинные преобразования


Класс NSAffineTransform предоставляет методы для создания, объединения и применения аффинных преобразований. Преобразование определяет, как точки в одной системе координат трансформируются в точки в другой системе координат. Аффинное преобразование — особый тип преобразования, которое сохраняет параллельные линии в трансформируемом контуре, но не обязательно сохраняет длины или углы. Масштабирование, вращение и перенос являются наиболее часто используемыми действиями, поддерживаемыми аффинными преобразованиями, но также возможен и сдвиг объектов.
Методы класса:

Создание объекта NSAffineTransform
Название
Описание
+ transform
Создает и возвращает новый объект NSAffineTransform инициализированный единичной матрицей.
- initWithTransform:
Инициализирует матрицу текущего объекта с помощью другого объекта transform и возвращает текущий объект.

Накопительные преобразования

Название
Описание
- rotateByDegrees:
Применяет коэффициент поворота (измеряется в градусах) к матрице преобразования текущего объекта.
- rotateByRadians:
Применяет коэффициент поворота (измеряется в радианах), к матрице преобразования текущего объекта.
- scaleBy:
Применяет указанный коэффициент масштабирования для осей x и y к матрице преобразования текущего объекта.
- scaleXBy:yBy:
Применяет коэффициенты масштабирования для каждой оси матрицы преобразования текущего объекта.
- translateXBy:yBy:
Применяет указанный коэффициент переноса к матрице преобразования текущего объекта.
- appendTransform:
Добавляет заданную матрицу к матрице текущего объекта.
- prependTransform:
Добавляет заданную матрицу к матрице текущего объекта.
- invert
Инвертирует матрицу текущего объекта.

Преобразование данных и объектов

Название
Описание
- transformPoint:
Применяет преобразование текущего объекта к указанному объекту NSPoint и возвращает результаты.
- transformSize:
Применяет преобразование текущего объекта к указанному объекту NSSize и возвращает результаты.

Доступ к структуре трансформации


Название
Описание
- transformStruct
Возвращает матричные коэффициенты, хранящиеся в матрице текущего объекта.
- setTransformStruct:
Заменяет значения коэффициентов матрицы преобразования текущего объекта указанными значениями.

15 февр. 2014 г.

Урок по работе с NSTableVIew. Добавление данных

Для пользователя очень важно, чтобы данные были представлены в удобном виде. В этой статье мы рассмотрим как создается табличное представление данных в OS X. Урок предназначен для тех кто уже более-менее знаком с Objective-C, и протоколами. Для начала создадим новый проект в Xcode (Cocoa). Назовем его, например, TableViewAddDataTest. Добавим на нашу форму TableView контрол. Выставим размеры согласно нашей форме (окну).



Установим количество колонок в таблице равным 1-й (Attribute Inspector -> Columns). Дальше заходим в Connections Inspector и соединяем (делаем связь) нашему аутлету dataSource и делегату delegate с AppDelegate.

А теперь о главном. "Нельзя просто так взять и добавить строчку в таблицу напрямую", проще всего и быстрее будет пакетная передача объектов таблице, что чаще в роли пакетов объектов выступают массивы, в нашем случае NSArray (для одной колонки).

И так - поехали. В наш хидер-файл AppDelegate.h добавим протокол (делегат), объявим наш массив dataArray и объект myTableView через который будем работать с таблицей и будем использовать методы NSTableView класса:

//
//  AppDelegate.h
//  TableViewAddDataTest
//
//  Created by Sergey Krasiuk on 15.02.14.
//  Copyright (c) 2014 Sergey Krasiuk. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource>
{
    NSArray *dataArray;
    NSTableView *myTableView;
}

@property (assign) IBOutlet NSWindow *window;

@end

Главное что нужно помнить при работе с табличным представлением, это - два обязательных метода, без которых в таблице не появятся данные:


//  Нужно передать табличному представлению количество строк
//  для отображения данных, в нашем случае это колличество элементов в массиве.
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView


//  Возвращает объект (данные которые будут отображаться в строке)
//  для каждой строчки row нашего табличного представления
- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

А теперь понятным языком. В первый метод мы должны передать количество объектов в нашем массиве. На основе этого в таблице будет выделена память под каждую строчку:


- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView
{
    return [dataArray count];
}

Следующий шаг. Мы должны передать для каждой строчки таблицы данные которые хранятся в нашем массиве. Т.е. человеческим языком индекс строки row будет равен индексу элемента нашего массива данных. В нашем случае мы передадим объекты типа NSString для каждой строки:


- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSString *arrayString = [dataArray objectAtIndex:row];
    return arrayString;
}


Проинициализируем наш массив (заполним его данными), т.к. пока что передавать нам в таблицу нечего (лучше всего инициализацию делать в методе init (в нашем случае), не в applicationDidFinishLaunching, при запуске массив не успеет заполнится данными и мы в таблице ничего не получим):


- (id) init
{
    self = [super init];
    
    if (self)
    {
        dataArray = [[NSArray alloc] initWithObjects:@"Первая строка", @"Вторая строка", @"Третья строка", @"Четвертая строка", @"Пятая строка", @"Шестая строка", nil];
    }
    
    return self;
}

Запускаем наш проект, и должно получится вот такое:
Нюанс в добавлении или удалении элементов (строк) из таблицы состоит в том чтобы вычислить выделенный объект (строку таблицы) и получить его индекс. Потом удалить/добавить объект под этим индексом из/в массива и вызвать в том же методе (в котором удаляем/добавляем объекты из массива) reloadTable. Табличное представление обновит данные из массива и покажет нужный результат:

- (void) tableViewSelectionDidChange: (NSNotification *) notification

Удачи в начинаниях. Еще один из примеров NSTableView


14 февр. 2014 г.

@property свойства класса


Ключевое слово @property позволяет объявить свойства класса в языке Objective C. По своей сути свойства являются средством написания кода, позволяющим удобно обращаться к полям класса, не нарушая принципа инкапсуляции и не используя синтаксис вызова методов. Свойства не обязательно должны базироваться на полях класса. Они могут, например, вычисляться во время каждого вызова. Основной смысл использования свойств – более удобный синтаксис в сравнении с обычными вызовами методов. Возможность использовать свойства появилась в языке Objective C начиная с версии 2.0. Для лучшего понимания принципов работы свойств рассмотрим несколько примеров. Предположим, у нас есть класс Car, содержащий поле speed для хранения скорости автомобиля. Тогда объявление этого класса будет выглядеть так:
@interface Car : NSObject
{
double speed;
}
-(double) getSpeed;
-(void) setSpeed:(double)s;
@end
Сообщения getSpeed и setSpeed позволяют читать и изменять закрытое поле speed, реализовывая принцип инкапсуляции. Реализация данного класса может выглядеть следующим образом:
@implementation Car
-(void) setSpeed:(double)s
{
if ( s>=0 )
{
speed = s;
}
}
-(double) getSpeed
{
return speed;
}
@end
Создание экземпляра этого класса и использование поля могут быть такими:
Car *car = [[Car alloc] init];
[car setSpeed:105];
NSLog(@"%f", [car getSpeed]);
[car release];
На приведенном выше примере можно увидеть, что чтение значений из полей класса и занесение новых значений синтаксически не очень удобно. Гораздо удобнее было бы напрямую обратиться к полям класса при помощи оператора -> Но тогда поля класса пришлось бы сделать открытыми и было бы невозможно контролировать значения, заносимые в поля. Применение свойств как раз и должно решить эту проблему. С использованием ключевого слова @property объявление класса примет такой вид:
@interface Car : NSObject{ double speed;} @property double speed; @end
Как видно из примера, при объявлении свойства указывается тип свойства и в данном случае он совпадает с типом поля класса. Так же Objective C допускает одинаковые названия свойств и полей классов. С учётом сделанных изменений, реализация класса будет такой:
@implementation Car
@synthesize speed;
@end
Упрощение кода в данном случае заметить не трудно. Мы просто убрали реализацию методов доступа к полю speed и заменили её на автоматическую генерацию поля при помощи ключевого слова @synthesize. Теперь попробуем воспользоваться созданным свойством:
Car *car = [[Car alloc] init];
car.speed = 45.5;
NSLog(@"%f", car.speed);
[car release];
Вот ради чего всё затевалось. Теперь мы можем обращаться к полю класса при помощи удобного оператора “точка”. В этом и есть основной смысл свойств. Но в этом коде всё ещё есть проблемы. Дело в том, что в поле speed можно запросто занести отрицательные значения. И данное автоматически сгенерированное свойство никак не может этому помешать. Такая реализация свойства не очень-то и полезна для класса Car. Поэтому переделаем реализацию, добавив в неё аксессоры для доступа к полю.
@implementation Car
-(void) setSpeed:(double)s
{
if(s>0) speed = s;
}
-(double) speed
{
return speed;
}
@end
Теперь свойство не позволит заносить в поле класса отрицательные значения. Несмотря на то, что кода стало больше, свойство защищает поле класса от некорректных значений. На примере можно увидеть, что имя метода, возвращающего значение, совпадает с именем свойства, а имя метода, записывающего новые значения почучается добавлением слова set в начало имени метода, название свойства начинается с большой буквы. В принципе, названия методов-аксессоров можно изменить. Для этого придётся внести изменения в объявление свойства:
@interface Car : NSObject
{
double speed;
}
@property (getter = getSpeed, setter = setSpeed:) double speed;
@end
После таких изменений объявления свойства метод, возвращающий значение свойства должен называться getSpeed, а метод задающий значение свойства, должен называться setSpeed.

Программирование на Objective-C. Урок 15

Програмирование на Objective-C. Урок 15

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 14

Програмирование на Objective-C. Урок 14

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 13

Програмирование на Objective-C. Урок 13

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 12

Програмирование на Objective-C. Урок 12

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 11

Програмирование на Objective-C. Урок 11

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)